diff --git a/mustache/pom.xml b/mustache/pom.xml
new file mode 100644
index 0000000000..8916b196f0
--- /dev/null
+++ b/mustache/pom.xml
@@ -0,0 +1,77 @@
+
+
+ 4.0.0
+ com.baeldung
+ mustache
+ 0.0.1-SNAPSHOT
+ jar
+ mustache
+
+
+
+ com.github.spullara.mustache.java
+ compiler
+ ${mustache.compiler.api.version}
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven-surefire-plugin.version}
+
+
+ **/*IntegrationTest.java
+ **/*LiveTest.java
+
+
+
+
+
+
+
+ 0.9.2
+ 3.7.0
+ 1.2.16
+ 4.12
+
+ UTF-8
+
+
+ 3.6.0
+ 2.19.1
+
+
+
\ No newline at end of file
diff --git a/mustache/src/main/java/com/baeldung/mustache/MustacheUtil.java b/mustache/src/main/java/com/baeldung/mustache/MustacheUtil.java
new file mode 100644
index 0000000000..a30bb23adb
--- /dev/null
+++ b/mustache/src/main/java/com/baeldung/mustache/MustacheUtil.java
@@ -0,0 +1,15 @@
+package com.baeldung.mustache;
+
+import com.github.mustachejava.DefaultMustacheFactory;
+import com.github.mustachejava.MustacheFactory;
+
+public class MustacheUtil {
+
+ private static final MustacheFactory mf = new DefaultMustacheFactory();
+
+ public static MustacheFactory getMustacheFactory(){
+ return mf;
+ }
+
+
+}
diff --git a/mustache/src/main/java/com/baeldung/mustache/model/Todo.java b/mustache/src/main/java/com/baeldung/mustache/model/Todo.java
new file mode 100644
index 0000000000..c329045876
--- /dev/null
+++ b/mustache/src/main/java/com/baeldung/mustache/model/Todo.java
@@ -0,0 +1,84 @@
+package com.baeldung.mustache.model;
+
+import java.time.Duration;
+import java.time.temporal.Temporal;
+import java.util.Date;
+import java.util.function.Function;
+
+public class Todo {
+
+ public Todo(){}
+
+ public Todo(String title, String text){
+ this.title = title;
+ this.text = text;
+ createdOn = new Date();
+ }
+
+ private String title;
+ private String text;
+ private boolean done = false;
+
+ private Date createdOn;
+ private Date completedOn;
+
+ public void markAsDone(){
+ done = true;
+ completedOn = new Date();
+ }
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public boolean getDone() {
+ return done;
+ }
+
+ public Date getCreatedOn() {
+ return createdOn;
+ }
+
+ public Date getCompletedOn() {
+ return completedOn;
+ }
+
+ public void setDone(boolean done) {
+ this.done = done;
+ }
+
+ public void setCompletedOn(Date completedOn) {
+ this.completedOn = completedOn;
+ }
+
+ public long doneSince(){
+ if ( done ){
+ return Duration.between(createdOn.toInstant(), completedOn.toInstant()).toMinutes();
+ }
+ return 0;
+ }
+
+ public Function