diff --git a/pom.xml b/pom.xml
index de4bd0ed8..298732fd5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,7 @@
     <module>observer</module>
     <module>state</module>
     <module>strategy</module>
+    <module>template-method</module>
   </modules>
   
 <build>
diff --git a/template-method/pom.xml b/template-method/pom.xml
new file mode 100644
index 000000000..90fde692d
--- /dev/null
+++ b/template-method/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>template-method</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <name>template-method</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/template-method/src/main/java/com/iluwatar/App.java b/template-method/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..7360eddf6
--- /dev/null
+++ b/template-method/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,12 @@
+package com.iluwatar;
+
+public class App 
+{
+    public static void main( String[] args )
+    {
+    	HalflingThief thief = new HalflingThief(new HitAndRunMethod());
+    	thief.steal();
+    	thief.changeMethod(new SubtleMethod());
+    	thief.steal();
+    }
+}
diff --git a/template-method/src/main/java/com/iluwatar/HalflingThief.java b/template-method/src/main/java/com/iluwatar/HalflingThief.java
new file mode 100644
index 000000000..64604a8b2
--- /dev/null
+++ b/template-method/src/main/java/com/iluwatar/HalflingThief.java
@@ -0,0 +1,18 @@
+package com.iluwatar;
+
+public class HalflingThief {
+
+	private StealingMethod method;
+
+	public HalflingThief(StealingMethod method) {
+		this.method = method;
+	}
+	
+	public void steal() {
+		method.steal();
+	}
+	
+	public void changeMethod(StealingMethod method) {
+		this.method = method;
+	}
+}
diff --git a/template-method/src/main/java/com/iluwatar/HitAndRunMethod.java b/template-method/src/main/java/com/iluwatar/HitAndRunMethod.java
new file mode 100644
index 000000000..99c0d61d1
--- /dev/null
+++ b/template-method/src/main/java/com/iluwatar/HitAndRunMethod.java
@@ -0,0 +1,20 @@
+package com.iluwatar;
+
+public class HitAndRunMethod extends StealingMethod {
+
+	@Override
+	protected String pickTarget() {
+		return "old goblin woman";
+	}
+
+	@Override
+	protected void confuseTarget(String target) {
+		System.out.println("Approach the " + target + " from behind.");
+	}
+
+	@Override
+	protected void stealTheItem(String target) {
+		System.out.println("Grab the handbag and run away fast!");
+	}
+
+}
diff --git a/template-method/src/main/java/com/iluwatar/StealingMethod.java b/template-method/src/main/java/com/iluwatar/StealingMethod.java
new file mode 100644
index 000000000..f24de7588
--- /dev/null
+++ b/template-method/src/main/java/com/iluwatar/StealingMethod.java
@@ -0,0 +1,17 @@
+package com.iluwatar;
+
+public abstract class StealingMethod {
+
+	protected abstract String pickTarget();
+	
+	protected abstract void confuseTarget(String target);
+	
+	protected abstract void stealTheItem(String target);
+
+	public void steal() {
+		String target = pickTarget();
+		System.out.println("The target has been chosen as " + target + ".");
+		confuseTarget(target);
+		stealTheItem(target);
+	}
+}
diff --git a/template-method/src/main/java/com/iluwatar/SubtleMethod.java b/template-method/src/main/java/com/iluwatar/SubtleMethod.java
new file mode 100644
index 000000000..8967a92d6
--- /dev/null
+++ b/template-method/src/main/java/com/iluwatar/SubtleMethod.java
@@ -0,0 +1,20 @@
+package com.iluwatar;
+
+public class SubtleMethod extends StealingMethod {
+
+	@Override
+	protected String pickTarget() {
+		return "shop keeper";
+	}
+
+	@Override
+	protected void confuseTarget(String target) {
+		System.out.println("Approach the " + target + " with tears running and hug him!");
+	}
+
+	@Override
+	protected void stealTheItem(String target) {
+		System.out.println("While in close contact grab the " + target + "'s wallet.");
+	}
+
+}