diff --git a/pom.xml b/pom.xml
index ade6285aa..88e3cdfab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,5 +21,6 @@
     <module>abstract-factory</module>
     <module>builder</module>
     <module>factory-method</module>
+    <module>prototype</module>
   </modules>
 </project>
\ No newline at end of file
diff --git a/prototype/pom.xml b/prototype/pom.xml
new file mode 100644
index 000000000..5f25ca866
--- /dev/null
+++ b/prototype/pom.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <groupId>com.iluwatar</groupId>
+    <artifactId>java-design-patterns</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <groupId>com.iluwatar</groupId>
+  <artifactId>prototype</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <name>prototype</name>
+  <url>http://maven.apache.org</url>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/prototype/src/main/java/com/iluwatar/App.java b/prototype/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..e94c834e3
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,28 @@
+package com.iluwatar;
+
+public class App 
+{
+    public static void main( String[] args )
+    {
+    	HeroFactory factory;
+    	Mage mage;
+    	Warlord warlord;
+    	Beast beast;
+    	
+    	factory = new HeroFactoryImpl(new ElfMage(), new ElfWarlord(), new ElfBeast());
+    	mage = factory.createMage();
+    	warlord = factory.createWarlord();
+    	beast = factory.createBeast();
+    	System.out.println(mage);
+    	System.out.println(warlord);
+    	System.out.println(beast);
+    	
+    	factory = new HeroFactoryImpl(new OrcMage(), new OrcWarlord(), new OrcBeast());
+    	mage = factory.createMage();
+    	warlord = factory.createWarlord();
+    	beast = factory.createBeast();
+    	System.out.println(mage);
+    	System.out.println(warlord);
+    	System.out.println(beast);
+    }
+}
diff --git a/prototype/src/main/java/com/iluwatar/Beast.java b/prototype/src/main/java/com/iluwatar/Beast.java
new file mode 100644
index 000000000..2d1e978c0
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/Beast.java
@@ -0,0 +1,8 @@
+package com.iluwatar;
+
+public abstract class Beast extends Prototype {
+
+	@Override
+	public abstract Beast clone() throws CloneNotSupportedException;
+	
+}
diff --git a/prototype/src/main/java/com/iluwatar/ElfBeast.java b/prototype/src/main/java/com/iluwatar/ElfBeast.java
new file mode 100644
index 000000000..40fac06b8
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/ElfBeast.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class ElfBeast extends Beast {
+
+	public ElfBeast() {
+	}
+	
+	public ElfBeast(ElfBeast beast) {
+	}
+	
+	@Override
+	public Beast clone() throws CloneNotSupportedException {
+		return new ElfBeast(this);
+	}
+
+	@Override
+	public String toString() {
+		return "Elven eagle";
+	}
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/ElfMage.java b/prototype/src/main/java/com/iluwatar/ElfMage.java
new file mode 100644
index 000000000..52919c91d
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/ElfMage.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class ElfMage extends Mage {
+
+	public ElfMage() {
+	}
+	
+	public ElfMage(ElfMage mage) {
+	}
+	
+	@Override
+	public Mage clone() throws CloneNotSupportedException {
+		return new ElfMage(this);
+	}
+
+	@Override
+	public String toString() {
+		return "Elven mage";
+	}
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/ElfWarlord.java b/prototype/src/main/java/com/iluwatar/ElfWarlord.java
new file mode 100644
index 000000000..51c52afdc
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/ElfWarlord.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class ElfWarlord extends Warlord {
+
+	public ElfWarlord() {
+	}
+	
+	public ElfWarlord(ElfWarlord warlord) {
+	}
+	
+	@Override
+	public Warlord clone() throws CloneNotSupportedException {
+		return new ElfWarlord(this);
+	}
+
+	@Override
+	public String toString() {
+		return "Elven warlord";
+	}
+
+}
diff --git a/prototype/src/main/java/com/iluwatar/HeroFactory.java b/prototype/src/main/java/com/iluwatar/HeroFactory.java
new file mode 100644
index 000000000..1d663c77f
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/HeroFactory.java
@@ -0,0 +1,11 @@
+package com.iluwatar;
+
+public interface HeroFactory {
+
+	Mage createMage();
+	
+	Warlord createWarlord();
+	
+	Beast createBeast();
+	
+}
diff --git a/prototype/src/main/java/com/iluwatar/HeroFactoryImpl.java b/prototype/src/main/java/com/iluwatar/HeroFactoryImpl.java
new file mode 100644
index 000000000..522b3f45f
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/HeroFactoryImpl.java
@@ -0,0 +1,39 @@
+package com.iluwatar;
+
+public class HeroFactoryImpl implements HeroFactory {
+
+	private Mage mage;
+	private Warlord warlord;
+	private Beast beast;
+
+	public HeroFactoryImpl(Mage mage, Warlord warlord, Beast beast) {
+		this.mage = mage;
+		this.warlord = warlord;
+		this.beast = beast;
+	}
+	
+	public Mage createMage() {
+		try {
+			return mage.clone();
+		} catch (CloneNotSupportedException e) {
+			return null;
+		}
+	}
+	
+	public Warlord createWarlord() {
+		try {
+			return warlord.clone();
+		} catch (CloneNotSupportedException e) {
+			return null;
+		}
+	}
+	
+	public Beast createBeast() {
+		try {
+			return beast.clone();
+		} catch (CloneNotSupportedException e) {
+			return null;
+		}
+	}
+	
+}
diff --git a/prototype/src/main/java/com/iluwatar/Mage.java b/prototype/src/main/java/com/iluwatar/Mage.java
new file mode 100644
index 000000000..726150633
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/Mage.java
@@ -0,0 +1,8 @@
+package com.iluwatar;
+
+public abstract class Mage extends Prototype {
+
+	@Override
+	public abstract Mage clone() throws CloneNotSupportedException;
+	
+}
diff --git a/prototype/src/main/java/com/iluwatar/OrcBeast.java b/prototype/src/main/java/com/iluwatar/OrcBeast.java
new file mode 100644
index 000000000..a5f52232c
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/OrcBeast.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class OrcBeast extends Beast {
+
+	public OrcBeast() {
+	}
+	
+	public OrcBeast(OrcBeast beast) {
+	}
+	
+	@Override
+	public Beast clone() throws CloneNotSupportedException {
+		return new OrcBeast(this);
+	}
+
+	@Override
+	public String toString() {
+		return "Orcish wolf";
+	}
+	
+}
diff --git a/prototype/src/main/java/com/iluwatar/OrcMage.java b/prototype/src/main/java/com/iluwatar/OrcMage.java
new file mode 100644
index 000000000..88e7718ac
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/OrcMage.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class OrcMage extends Mage {
+
+	public OrcMage() {
+	}
+	
+	public OrcMage(OrcMage mage) {
+	}
+	
+	@Override
+	public Mage clone() throws CloneNotSupportedException {
+		return new OrcMage(this);
+	}
+
+	@Override
+	public String toString() {
+		return "Orcish mage";
+	}
+	
+}
diff --git a/prototype/src/main/java/com/iluwatar/OrcWarlord.java b/prototype/src/main/java/com/iluwatar/OrcWarlord.java
new file mode 100644
index 000000000..62ab25975
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/OrcWarlord.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+public class OrcWarlord extends Warlord {
+
+	public OrcWarlord() {
+	}
+	
+	public OrcWarlord(OrcWarlord warlord) {
+	}
+	
+	@Override
+	public Warlord clone() throws CloneNotSupportedException {
+		return new OrcWarlord(this);
+	}
+
+	@Override
+	public String toString() {
+		return "Orcish warlord";
+	}
+	
+}
diff --git a/prototype/src/main/java/com/iluwatar/Prototype.java b/prototype/src/main/java/com/iluwatar/Prototype.java
new file mode 100644
index 000000000..e508aea6e
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/Prototype.java
@@ -0,0 +1,8 @@
+package com.iluwatar;
+
+public abstract class Prototype implements Cloneable {
+
+	@Override
+	public abstract Object clone() throws CloneNotSupportedException;
+	
+}
diff --git a/prototype/src/main/java/com/iluwatar/Warlord.java b/prototype/src/main/java/com/iluwatar/Warlord.java
new file mode 100644
index 000000000..4ddcdd251
--- /dev/null
+++ b/prototype/src/main/java/com/iluwatar/Warlord.java
@@ -0,0 +1,8 @@
+package com.iluwatar;
+
+public abstract class Warlord extends Prototype {
+
+	@Override
+	public abstract Warlord clone() throws CloneNotSupportedException;
+	
+}