diff --git a/src/main/java/seedu/address/logic/commands/tasks/AddTaskCommand.java b/src/main/java/seedu/address/logic/commands/tasks/AddTaskCommand.java
index a5e7b9b6dd5..45b147ea2fb 100644
--- a/src/main/java/seedu/address/logic/commands/tasks/AddTaskCommand.java
+++ b/src/main/java/seedu/address/logic/commands/tasks/AddTaskCommand.java
@@ -4,23 +4,22 @@
 import static seedu.address.logic.parser.CliSyntax.PREFIX_DESCRIPTION;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_TITLE;
 
-import seedu.address.logic.commands.Command;
 import seedu.address.logic.commands.CommandResult;
 import seedu.address.logic.commands.exceptions.CommandException;
 import seedu.address.model.Model;
 import seedu.address.model.task.Task;
 
 //@@author connlim
+
 /**
  * Create a task and assign it to a group
  */
-public class AddTaskCommand extends Command {
-    public static final String COMMAND_WORD = "task";
+public class AddTaskCommand extends TaskCommand {
+    public static final String SUBCOMMAND_WORD = "add";
 
-    public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a task to the address book current team. "
-            + "Parameters: "
-            + PREFIX_TITLE + "NAME "
-            + PREFIX_DESCRIPTION + "Description";
+    public static final String MESSAGE_USAGE =
+            TaskCommand.getFullCommand(SUBCOMMAND_WORD) + ": Adds a task to the address book current team. "
+                    + "Parameters: " + PREFIX_TITLE + "NAME " + PREFIX_DESCRIPTION + "Description";
 
     public static final String MESSAGE_SUCCESS = "New task have been added: %1$s";
     public static final String MESSAGE_DUPLICATE_TASK = "This task already exists!";
@@ -55,6 +54,6 @@ public CommandResult execute(Model model) throws CommandException {
     public boolean equals(Object other) {
         return other == this // short circuit if same object
                 || (other instanceof AddTaskCommand // instanceof handles nulls
-                        && toAdd.equals(((AddTaskCommand) other).toAdd));
+                && toAdd.equals(((AddTaskCommand) other).toAdd));
     }
 }
diff --git a/src/main/java/seedu/address/logic/commands/tasks/RmTaskCommand.java b/src/main/java/seedu/address/logic/commands/tasks/DeleteTaskCommand.java
similarity index 68%
rename from src/main/java/seedu/address/logic/commands/tasks/RmTaskCommand.java
rename to src/main/java/seedu/address/logic/commands/tasks/DeleteTaskCommand.java
index dfdfb5a94f4..b185146fb63 100644
--- a/src/main/java/seedu/address/logic/commands/tasks/RmTaskCommand.java
+++ b/src/main/java/seedu/address/logic/commands/tasks/DeleteTaskCommand.java
@@ -6,29 +6,29 @@
 
 import seedu.address.commons.core.Messages;
 import seedu.address.commons.core.index.Index;
-import seedu.address.logic.commands.Command;
 import seedu.address.logic.commands.CommandResult;
 import seedu.address.logic.commands.exceptions.CommandException;
 import seedu.address.model.Model;
 import seedu.address.model.task.Task;
 
-//@@author mohamedsaf1
 /**
- * Removes a task from Contactmation
+ * Deletes a task from Contactmation.
+ *
+ * @author connlim
+ * @author mohamedsaf1
  */
-public class RmTaskCommand extends Command {
-    public static final String COMMAND_WORD = "rmTask";
+public class DeleteTaskCommand extends TaskCommand {
+    public static final String SUBCOMMAND_WORD = "delete";
 
-    public static final String MESSAGE_USAGE = COMMAND_WORD
-            + ": Delete the selected task\n"
-            + "Parameters: INDEX (must be a positive integer)\n"
-            + "Example: " + COMMAND_WORD + " 1\n";
+    public static final String MESSAGE_USAGE =
+            TaskCommand.getFullCommand(SUBCOMMAND_WORD) + ": Delete the selected task\n"
+                    + "Parameters: INDEX (must be a positive integer)\n" + "Example: " + COMMAND_WORD + " 1\n";
 
     public static final String DELETE_SUCCESS = " task %s is deleted%n";
 
     private final Index targetIndex;
 
-    public RmTaskCommand(Index targetIndex) {
+    public DeleteTaskCommand(Index targetIndex) {
         this.targetIndex = targetIndex;
     }
 
diff --git a/src/main/java/seedu/address/logic/commands/tasks/MarkCommand.java b/src/main/java/seedu/address/logic/commands/tasks/MarkTaskCommand.java
similarity index 77%
rename from src/main/java/seedu/address/logic/commands/tasks/MarkCommand.java
rename to src/main/java/seedu/address/logic/commands/tasks/MarkTaskCommand.java
index 60cac2295a1..852796203d7 100644
--- a/src/main/java/seedu/address/logic/commands/tasks/MarkCommand.java
+++ b/src/main/java/seedu/address/logic/commands/tasks/MarkTaskCommand.java
@@ -6,30 +6,29 @@
 
 import seedu.address.commons.core.Messages;
 import seedu.address.commons.core.index.Index;
-import seedu.address.logic.commands.Command;
 import seedu.address.logic.commands.CommandResult;
 import seedu.address.logic.commands.exceptions.CommandException;
 import seedu.address.model.Model;
 import seedu.address.model.task.Task;
 
 //@@author connlim
+
 /**
  * Marks a task as complete
  */
-public class MarkCommand extends Command {
-    public static final String COMMAND_WORD = "mark";
+public class MarkTaskCommand extends TaskCommand {
+    public static final String SUBCOMMAND_WORD = "mark";
 
-    public static final String MESSAGE_USAGE = COMMAND_WORD
-            + ": Marks the task as completed\n"
-            + "Parameters: INDEX (must be a positive integer)\n"
-            + "Example: " + COMMAND_WORD + " 1\n";
+    public static final String MESSAGE_USAGE =
+            TaskCommand.getFullCommand(SUBCOMMAND_WORD) + ": Marks the task as completed\n"
+                    + "Parameters: INDEX (must be a positive integer)\n" + "Example: " + COMMAND_WORD + " 1\n";
 
     public static final String COMPLETE_SUCESS = " task %s is marked as complete%n";
     public static final String ALREADY_MARKED = " task %s is already completed%n";
 
     private final Index targetIndex;
 
-    public MarkCommand(Index targetIndex) {
+    public MarkTaskCommand(Index targetIndex) {
         this.targetIndex = targetIndex;
     }
 
diff --git a/src/main/java/seedu/address/logic/commands/tasks/TaskCommand.java b/src/main/java/seedu/address/logic/commands/tasks/TaskCommand.java
new file mode 100644
index 00000000000..64114588f81
--- /dev/null
+++ b/src/main/java/seedu/address/logic/commands/tasks/TaskCommand.java
@@ -0,0 +1,21 @@
+package seedu.address.logic.commands.tasks;
+
+import seedu.address.logic.commands.Command;
+
+/**
+ * Commands for Tasks
+ */
+public abstract class TaskCommand extends Command {
+
+    public static final String COMMAND_WORD = "task";
+
+    /**
+     * Returns the complete command phrase for the task command with given subCommand
+     *
+     * @param subcommand The subcommand to be added
+     * @return The complete command phrase
+     */
+    static String getFullCommand(String subcommand) {
+        return "task " + subcommand;
+    }
+}
diff --git a/src/main/java/seedu/address/logic/commands/tasks/UnmarkCommand.java b/src/main/java/seedu/address/logic/commands/tasks/UnmarkTaskCommand.java
similarity index 75%
rename from src/main/java/seedu/address/logic/commands/tasks/UnmarkCommand.java
rename to src/main/java/seedu/address/logic/commands/tasks/UnmarkTaskCommand.java
index 6634a773e11..e7154c2c026 100644
--- a/src/main/java/seedu/address/logic/commands/tasks/UnmarkCommand.java
+++ b/src/main/java/seedu/address/logic/commands/tasks/UnmarkTaskCommand.java
@@ -6,30 +6,29 @@
 
 import seedu.address.commons.core.Messages;
 import seedu.address.commons.core.index.Index;
-import seedu.address.logic.commands.Command;
 import seedu.address.logic.commands.CommandResult;
 import seedu.address.logic.commands.exceptions.CommandException;
 import seedu.address.model.Model;
 import seedu.address.model.task.Task;
 
 //@@author connlim
+
 /**
  * Unmarks a task as complete.
  */
-public class UnmarkCommand extends Command {
-    public static final String COMMAND_WORD = "unmark";
+public class UnmarkTaskCommand extends TaskCommand {
+    public static final String SUBCOMMAND_WORD = "unmark";
 
-    public static final String MESSAGE_USAGE = COMMAND_WORD
-            + ": Marks the task as incompleted\n"
-            + "Parameters: INDEX (must be a positive integer)\n"
-            + "Example: " + COMMAND_WORD + " 1\n";
+    public static final String MESSAGE_USAGE =
+            TaskCommand.getFullCommand(SUBCOMMAND_WORD) + ": Marks the task as incomplete\n"
+                    + "Parameters: INDEX (must be a positive integer)\n" + "Example: " + COMMAND_WORD + " 1\n";
 
-    public static final String ALREADY_UNMARKED = " task %s is already incompleted%n";
+    public static final String ALREADY_UNMARKED = " task %s is already incomplete%n";
     public static final String UNMARK_SUCCESS = " task %s is marked as incomplete%n";
 
     private final Index targetIndex;
 
-    public UnmarkCommand(Index targetIndex) {
+    public UnmarkTaskCommand(Index targetIndex) {
         this.targetIndex = targetIndex;
     }
 
diff --git a/src/main/java/seedu/address/logic/parser/AddressBookParser.java b/src/main/java/seedu/address/logic/parser/AddressBookParser.java
index 8ba4bc6c33f..18a1c0fe5d0 100644
--- a/src/main/java/seedu/address/logic/parser/AddressBookParser.java
+++ b/src/main/java/seedu/address/logic/parser/AddressBookParser.java
@@ -17,16 +17,14 @@
 import seedu.address.logic.commands.HelpCommand;
 import seedu.address.logic.commands.ListCommand;
 import seedu.address.logic.commands.RemoveFieldCommand;
-import seedu.address.logic.commands.tasks.AddTaskCommand;
-import seedu.address.logic.commands.tasks.MarkCommand;
-import seedu.address.logic.commands.tasks.RmTaskCommand;
-import seedu.address.logic.commands.tasks.UnmarkCommand;
+import seedu.address.logic.commands.tasks.TaskCommand;
 import seedu.address.logic.commands.teams.AddTeamCommand;
 import seedu.address.logic.commands.teams.AddUserToTeamCommand;
 import seedu.address.logic.commands.teams.ChangeTeamCommand;
 import seedu.address.logic.commands.teams.DeleteTeamCommand;
 import seedu.address.logic.commands.teams.RemoveUserFromTeamCommand;
 import seedu.address.logic.parser.exceptions.ParseException;
+import seedu.address.logic.parser.tasks.TaskCommandParser;
 
 /**
  * Parses user input.
@@ -90,17 +88,8 @@ public Command parseCommand(String userInput) throws ParseException {
         case ChangeTeamCommand.COMMAND_WORD:
             return new ChangeTeamCommandParser().parse(arguments);
 
-        case MarkCommand.COMMAND_WORD:
-            return new MarkCommandParser().parse(arguments);
-
-        case UnmarkCommand.COMMAND_WORD:
-            return new UnmarkCommandParser().parse(arguments);
-
-        case AddTaskCommand.COMMAND_WORD:
-            return new AddTaskCommandParser().parse(arguments);
-
-        case RmTaskCommand.COMMAND_WORD:
-            return new RmTaskCommandParser().parse(arguments);
+        case TaskCommand.COMMAND_WORD:
+            return new TaskCommandParser().parse(arguments);
 
         case DeleteTeamCommand.COMMAND_WORD:
             return new DeleteTeamCommandParser().parse(arguments);
diff --git a/src/main/java/seedu/address/logic/parser/MarkCommandParser.java b/src/main/java/seedu/address/logic/parser/MarkCommandParser.java
deleted file mode 100644
index 5bd89de4b21..00000000000
--- a/src/main/java/seedu/address/logic/parser/MarkCommandParser.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package seedu.address.logic.parser;
-
-import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
-
-import seedu.address.commons.core.index.Index;
-import seedu.address.logic.commands.tasks.MarkCommand;
-import seedu.address.logic.parser.exceptions.ParseException;
-
-//@@author connlim
-/**
- * Parses input arguments and creates a new MarkCommand object
- */
-public class MarkCommandParser implements Parser<MarkCommand> {
-
-    @Override
-    public MarkCommand parse(String args) throws ParseException {
-        try {
-            Index index = ParserUtil.parseIndex(args);
-            return new MarkCommand(index);
-        } catch (ParseException pe) {
-            throw new ParseException(
-                    String.format(MESSAGE_INVALID_COMMAND_FORMAT, MarkCommand.MESSAGE_USAGE), pe);
-        }
-    }
-
-}
diff --git a/src/main/java/seedu/address/logic/parser/RmTaskCommandParser.java b/src/main/java/seedu/address/logic/parser/RmTaskCommandParser.java
deleted file mode 100644
index 4a77e9b6199..00000000000
--- a/src/main/java/seedu/address/logic/parser/RmTaskCommandParser.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package seedu.address.logic.parser;
-
-import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
-
-import seedu.address.commons.core.index.Index;
-import seedu.address.logic.commands.tasks.RmTaskCommand;
-import seedu.address.logic.commands.tasks.UnmarkCommand;
-import seedu.address.logic.parser.exceptions.ParseException;
-
-//@@author mohamedsaf1
-/**
- * Parses input arguments and creates a new RmTaskCommand object
- */
-public class RmTaskCommandParser implements Parser<RmTaskCommand> {
-
-    @Override
-    public RmTaskCommand parse(String args) throws ParseException {
-        try {
-            Index index = ParserUtil.parseIndex(args);
-            return new RmTaskCommand(index);
-        } catch (ParseException pe) {
-            throw new ParseException(
-                    String.format(MESSAGE_INVALID_COMMAND_FORMAT, UnmarkCommand.MESSAGE_USAGE), pe);
-        }
-    }
-
-}
diff --git a/src/main/java/seedu/address/logic/parser/UnmarkCommandParser.java b/src/main/java/seedu/address/logic/parser/UnmarkCommandParser.java
deleted file mode 100644
index 69c873b4260..00000000000
--- a/src/main/java/seedu/address/logic/parser/UnmarkCommandParser.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package seedu.address.logic.parser;
-
-import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
-
-import seedu.address.commons.core.index.Index;
-import seedu.address.logic.commands.tasks.UnmarkCommand;
-import seedu.address.logic.parser.exceptions.ParseException;
-
-//@@author connlim
-/**
- * Parses input arguments and creates a new UnmarkCommand object
- */
-public class UnmarkCommandParser implements Parser<UnmarkCommand> {
-
-    @Override
-    public UnmarkCommand parse(String args) throws ParseException {
-        try {
-            Index index = ParserUtil.parseIndex(args);
-            return new UnmarkCommand(index);
-        } catch (ParseException pe) {
-            throw new ParseException(
-                    String.format(MESSAGE_INVALID_COMMAND_FORMAT, UnmarkCommand.MESSAGE_USAGE), pe);
-        }
-    }
-
-}
diff --git a/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java b/src/main/java/seedu/address/logic/parser/tasks/AddTaskCommandParser.java
similarity index 86%
rename from src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java
rename to src/main/java/seedu/address/logic/parser/tasks/AddTaskCommandParser.java
index f9df0e54142..778325d3992 100644
--- a/src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java
+++ b/src/main/java/seedu/address/logic/parser/tasks/AddTaskCommandParser.java
@@ -1,4 +1,4 @@
-package seedu.address.logic.parser;
+package seedu.address.logic.parser.tasks;
 
 import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
 import static seedu.address.logic.parser.CliSyntax.PREFIX_DESCRIPTION;
@@ -7,6 +7,10 @@
 import java.util.stream.Stream;
 
 import seedu.address.logic.commands.tasks.AddTaskCommand;
+import seedu.address.logic.parser.ArgumentMultimap;
+import seedu.address.logic.parser.ArgumentTokenizer;
+import seedu.address.logic.parser.Parser;
+import seedu.address.logic.parser.Prefix;
 import seedu.address.logic.parser.exceptions.ParseException;
 import seedu.address.model.task.Task;
 
diff --git a/src/main/java/seedu/address/logic/parser/tasks/DeleteTaskCommandParser.java b/src/main/java/seedu/address/logic/parser/tasks/DeleteTaskCommandParser.java
new file mode 100644
index 00000000000..044d4a71297
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/tasks/DeleteTaskCommandParser.java
@@ -0,0 +1,29 @@
+package seedu.address.logic.parser.tasks;
+
+import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.logic.commands.tasks.DeleteTaskCommand;
+import seedu.address.logic.parser.Parser;
+import seedu.address.logic.parser.ParserUtil;
+import seedu.address.logic.parser.exceptions.ParseException;
+
+//@@author mohamedsaf1
+
+/**
+ * Parses input arguments and creates a new RmTaskCommand object
+ */
+public class DeleteTaskCommandParser implements Parser<DeleteTaskCommand> {
+
+    @Override
+    public DeleteTaskCommand parse(String args) throws ParseException {
+        try {
+            Index index = ParserUtil.parseIndex(args);
+            return new DeleteTaskCommand(index);
+        } catch (ParseException pe) {
+            throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, DeleteTaskCommand.MESSAGE_USAGE),
+                    pe);
+        }
+    }
+
+}
diff --git a/src/main/java/seedu/address/logic/parser/tasks/MarkTaskCommandParser.java b/src/main/java/seedu/address/logic/parser/tasks/MarkTaskCommandParser.java
new file mode 100644
index 00000000000..c0fe40b4384
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/tasks/MarkTaskCommandParser.java
@@ -0,0 +1,28 @@
+package seedu.address.logic.parser.tasks;
+
+import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.logic.commands.tasks.MarkTaskCommand;
+import seedu.address.logic.parser.Parser;
+import seedu.address.logic.parser.ParserUtil;
+import seedu.address.logic.parser.exceptions.ParseException;
+
+//@@author connlim
+/**
+ * Parses input arguments and creates a new MarkTaskCommand object
+ */
+public class MarkTaskCommandParser implements Parser<MarkTaskCommand> {
+
+    @Override
+    public MarkTaskCommand parse(String args) throws ParseException {
+        try {
+            Index index = ParserUtil.parseIndex(args);
+            return new MarkTaskCommand(index);
+        } catch (ParseException pe) {
+            throw new ParseException(
+                    String.format(MESSAGE_INVALID_COMMAND_FORMAT, MarkTaskCommand.MESSAGE_USAGE), pe);
+        }
+    }
+
+}
diff --git a/src/main/java/seedu/address/logic/parser/tasks/TaskCommandParser.java b/src/main/java/seedu/address/logic/parser/tasks/TaskCommandParser.java
new file mode 100644
index 00000000000..4fec9e43301
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/tasks/TaskCommandParser.java
@@ -0,0 +1,57 @@
+package seedu.address.logic.parser.tasks;
+
+
+import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import seedu.address.logic.commands.tasks.AddTaskCommand;
+import seedu.address.logic.commands.tasks.DeleteTaskCommand;
+import seedu.address.logic.commands.tasks.MarkTaskCommand;
+import seedu.address.logic.commands.tasks.TaskCommand;
+import seedu.address.logic.commands.tasks.UnmarkTaskCommand;
+import seedu.address.logic.parser.Parser;
+import seedu.address.logic.parser.exceptions.ParseException;
+
+/**
+ * Parser for all Task commands
+ */
+public class TaskCommandParser implements Parser<TaskCommand> {
+    private static final String MESSAGE_USAGE = TaskCommand.COMMAND_WORD + " [add|delete|mark|unmark|set]";
+    /**
+     * Used for initial separation of command word and args.
+     */
+    private static final Pattern BASIC_COMMAND_FORMAT = Pattern.compile("(?<subcommandWord>\\S+)(?<arguments>.*)");
+
+    /**
+     * Parses user input into command for execution. The input must be a valid subcommand for Task. There should not be
+     * a TaskCommand prefix in the input.
+     *
+     * @param userInput full user input string
+     * @return the command based on the user input
+     * @throws ParseException if the user input does not conform the expected format
+     */
+    public TaskCommand parse(String userInput) throws ParseException {
+        final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(userInput.trim());
+        if (!matcher.matches()) {
+            throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, MESSAGE_USAGE));
+        }
+
+        final String commandWord = matcher.group("subcommandWord");
+        final String arguments = matcher.group("arguments");
+
+        switch (commandWord) {
+        case AddTaskCommand.SUBCOMMAND_WORD:
+            return new AddTaskCommandParser().parse(arguments);
+        case DeleteTaskCommand.SUBCOMMAND_WORD:
+            return new DeleteTaskCommandParser().parse(arguments);
+        case MarkTaskCommand.SUBCOMMAND_WORD:
+            return new MarkTaskCommandParser().parse(arguments);
+        case UnmarkTaskCommand.SUBCOMMAND_WORD:
+            return new UnmarkTaskCommandParser().parse(arguments);
+        default:
+            throw new ParseException(MESSAGE_USAGE);
+        }
+    }
+}
diff --git a/src/main/java/seedu/address/logic/parser/tasks/UnmarkTaskCommandParser.java b/src/main/java/seedu/address/logic/parser/tasks/UnmarkTaskCommandParser.java
new file mode 100644
index 00000000000..16da0f8d9c4
--- /dev/null
+++ b/src/main/java/seedu/address/logic/parser/tasks/UnmarkTaskCommandParser.java
@@ -0,0 +1,28 @@
+package seedu.address.logic.parser.tasks;
+
+import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
+
+import seedu.address.commons.core.index.Index;
+import seedu.address.logic.commands.tasks.UnmarkTaskCommand;
+import seedu.address.logic.parser.Parser;
+import seedu.address.logic.parser.ParserUtil;
+import seedu.address.logic.parser.exceptions.ParseException;
+
+//@@author connlim
+/**
+ * Parses input arguments and creates a new UnmarkTaskCommand object
+ */
+public class UnmarkTaskCommandParser implements Parser<UnmarkTaskCommand> {
+
+    @Override
+    public UnmarkTaskCommand parse(String args) throws ParseException {
+        try {
+            Index index = ParserUtil.parseIndex(args);
+            return new UnmarkTaskCommand(index);
+        } catch (ParseException pe) {
+            throw new ParseException(
+                    String.format(MESSAGE_INVALID_COMMAND_FORMAT, UnmarkTaskCommand.MESSAGE_USAGE), pe);
+        }
+    }
+
+}