diff --git a/src/main/java/tmltranslator/mutations/AddAttributeMutation.java b/src/main/java/tmltranslator/mutations/AddAttributeMutation.java
index d79310d5bcb8a7f8c6b7485ecf1efb4a95b38de5..e07894f0fda5ea72d64f205bc8d4e9e5bf88cb00 100644
--- a/src/main/java/tmltranslator/mutations/AddAttributeMutation.java
+++ b/src/main/java/tmltranslator/mutations/AddAttributeMutation.java
@@ -59,7 +59,8 @@ public class AddAttributeMutation extends AttributeMutation {
         String _attributeName = tokens[index + 2];
         String[] types = {"INT","BOOL"};
         if (!Arrays.asList(types).contains(_attributeType.toUpperCase())){
-            throw new ParseDiplodocusMutationException("Missing type. Expected format is add attribute type name[=val] in taskName");
+            throw new ParseDiplodocusMutationException("Missing or wrong type. Expected format is add attribute type name[=val] in taskName, and " +
+                    "type is int or bool.");
         }
 
         index = DiplodocusMutationParser.indexOf(tokens, "IN");
diff --git a/src/main/java/tmltranslator/mutations/AddTaskMutation.java b/src/main/java/tmltranslator/mutations/AddTaskMutation.java
index fcc5be46da0828cf05b5802c41a6cb706b55a09a..23222c8b644d15a2e1850c2d13557ff3f0dc1590 100644
--- a/src/main/java/tmltranslator/mutations/AddTaskMutation.java
+++ b/src/main/java/tmltranslator/mutations/AddTaskMutation.java
@@ -33,7 +33,7 @@ public class AddTaskMutation extends TaskMutation {
         String[] tokens = DiplodocusMutationParser.tokenise(toParse);
         int index = DiplodocusMutationParser.indexOf(tokens, "TASK");
         if (tokens.length == index + 1) {
-            throw new ParseDiplodocusMutationException("Block name missing. Expected syntax is [add task taskName]");
+            throw new ParseDiplodocusMutationException("Task name missing. Expected format is add task taskName");
         }
         String _taskName = tokens[index + 1];
         AddTaskMutation mutation = new AddTaskMutation(_taskName);
diff --git a/src/main/java/tmltranslator/mutations/CloneTaskMutation.java b/src/main/java/tmltranslator/mutations/CloneTaskMutation.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7b847c70057e1b4607d6a9a53a877a0db8ca43d
--- /dev/null
+++ b/src/main/java/tmltranslator/mutations/CloneTaskMutation.java
@@ -0,0 +1,60 @@
+package tmltranslator.mutations;
+
+import tmltranslator.TMLCheckingError;
+import tmltranslator.TMLModeling;
+import tmltranslator.TMLTask;
+
+public class CloneTaskMutation extends TaskMutation{
+
+    private String newTaskName;
+    protected CloneTaskMutation(String _taskName, String _newTaskName) {
+        super(_taskName);
+        setNewTaskName(_newTaskName);
+    }
+
+    protected void setNewTaskName(String _newTaskName){
+        newTaskName = _newTaskName;
+    }
+
+    protected String getNewTaskName(){
+        return newTaskName;
+    }
+
+    @Override
+    public void apply(TMLModeling<?> _tmlModel) throws ApplyDiplodocusMutationException {
+        TMLTask task = getTask(_tmlModel);
+        TMLTask newTask = null;
+
+        if (task == null){
+            throw new ApplyDiplodocusMutationException("Task " + getTaskName() + " does not exist in the current model.");
+        }
+        try {
+            newTask = task.deepClone(_tmlModel);
+        } catch (TMLCheckingError e) {
+            throw new RuntimeException(e);
+        }
+        newTask.setName(_tmlModel.getTasks().get(0).getName().split("__")[0] + "__" + getNewTaskName());
+        _tmlModel.addTask(newTask);
+    }
+
+    public static CloneTaskMutation createFromString(String toParse) throws ParseDiplodocusMutationException{
+        String[] tokens = DiplodocusMutationParser.tokenise(toParse);
+
+        int index = DiplodocusMutationParser.indexOf(tokens, "TASK");
+        if (tokens.length == index + 1) {
+            throw new ParseDiplodocusMutationException("Task name missing. Expected format is clone task taskName in newTaskName");
+        }
+        String _taskName = tokens[index + 1];
+
+        index = DiplodocusMutationParser.indexOf(tokens,"IN");
+        if (tokens.length == index + 1) {
+            throw new ParseDiplodocusMutationException("New task name missing. Expected format is clone task taskName in newTaskName");
+        }
+        String _newTaskName = tokens[index + 1];
+
+        CloneTaskMutation mutation = new CloneTaskMutation(_taskName, _newTaskName);
+        mutation.setMutationType("TMLmutation");
+        return mutation;
+    }
+
+}
diff --git a/src/main/java/tmltranslator/mutations/DiplodocusMutationParser.java b/src/main/java/tmltranslator/mutations/DiplodocusMutationParser.java
index 0ca4c5a2224373adef45b65024c1816f7e6b7604..7d70b80eeb98efec576b14e6ec0e858c9ce8fab9 100644
--- a/src/main/java/tmltranslator/mutations/DiplodocusMutationParser.java
+++ b/src/main/java/tmltranslator/mutations/DiplodocusMutationParser.java
@@ -42,7 +42,7 @@ import java.util.UUID;
 
 public interface DiplodocusMutationParser {
 
-    public static final String[] MUTATION_TOKENS = {"ADD", "RM", "REMOVE", "MD", "MODIFY"};
+    public static final String[] MUTATION_TOKENS = {"ADD", "RM", "REMOVE", "MD", "MODIFY", "CLONE"};
     /*public static final String[] ELEMENT_TOKENS = {"ATTRIBUTE", "METHOD", "INPUT", "OUTPUT", "STATE", "ACTION", "RANDOM", "SET", "RESET", "EXPIRE"
             , "TRANSITION", "CONNECTION", "LINK", "SIGNAL", "BLOCK"};*/
     public static final String[] ELEMENT_TOKENS = {"TASK", "CONNECTION", "PORT", "ATTRIBUTE"};
diff --git a/src/main/java/tmltranslator/mutations/TaskMutation.java b/src/main/java/tmltranslator/mutations/TaskMutation.java
index 6f1d854c6cbc535f7a49aa50e62a944fe8582017..df65004ed1a1f7422fcf73c4fdd6c44c2e5e6c74 100644
--- a/src/main/java/tmltranslator/mutations/TaskMutation.java
+++ b/src/main/java/tmltranslator/mutations/TaskMutation.java
@@ -30,6 +30,8 @@ public abstract class TaskMutation extends DiplodocusMutation {
         switch (DiplodocusMutationParser.findMutationToken(toParse)){
             case "ADD":
                 return AddTaskMutation.createFromString(toParse);
+            case "CLONE":
+                return CloneTaskMutation.createFromString(toParse);
             case "RM":
             case "REMOVE":
                 return RemoveTaskMutation.createFromString(toParse);