Index: /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/AbstractTrainCommand.java
===================================================================
--- /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/AbstractTrainCommand.java	(revision 184)
+++ /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/AbstractTrainCommand.java	(revision 184)
@@ -0,0 +1,100 @@
+package de.ugoe.cs.eventbench.commands;
+
+import java.security.InvalidParameterException;
+import java.util.List;
+
+import de.ugoe.cs.eventbench.data.Event;
+import de.ugoe.cs.eventbench.data.GlobalDataContainer;
+import de.ugoe.cs.eventbench.models.TrieBasedModel;
+import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * <p>
+ * Abstract class for commands to train {@link TrieBasedModel}s.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public abstract class AbstractTrainCommand implements Command {
+
+	/**
+	 * <p>
+	 * Handling of additional parameters.
+	 * </p>
+	 * 
+	 * @param parameters
+	 *            same as the parameters passed to {@link #run(List)}.
+	 * @throws Exception
+	 *             thrown, if there is an error parsing the parameters
+	 */
+	abstract void handleAdditionalParameters(List<Object> parameters)
+			throws Exception;
+
+	/**
+	 * <p>
+	 * Returns a concrete instance of {@link TrieBasedModel} to be trained. This
+	 * is a factory method.
+	 * </p>
+	 * 
+	 * @return instance of {@link TrieBasedModel}
+	 */
+	abstract TrieBasedModel createModel();
+
+	/**
+	 * <p>
+	 * The command is implemented as a template method. The general structure of
+	 * the command is always the same, only the parameters of the command and
+	 * the creation of the {@link TrieBasedModel} instance. The former is
+	 * handled by {@link #handleOptionalParameters(List)}, the latter by
+	 * {@link #createModel()}.
+	 * </p>
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void run(List<Object> parameters) {
+		String modelname;
+		String sequencesName;
+
+		try {
+			modelname = (String) parameters.get(0);
+			sequencesName = (String) parameters.get(1);
+			handleAdditionalParameters(parameters);
+		} catch (Exception e) {
+			throw new InvalidParameterException();
+		}
+
+		List<List<Event<?>>> sequences = null;
+		Object dataObject = GlobalDataContainer.getInstance().getData(
+				sequencesName);
+		if (dataObject == null) {
+			Console.println("Object " + sequencesName
+					+ " not found in storage.");
+			return;
+		}
+		try {
+			sequences = (List<List<Event<?>>>) dataObject;
+		} catch (ClassCastException e) {
+			Console.println("Object " + sequencesName
+					+ "not of type List<List<Event<?>>>.");
+		}
+		if (sequences.size() == 0 || !(sequences.get(0).get(0) instanceof Event) ) {
+			Console.println("Object " + sequencesName
+					+ "not of type List<List<Event<?>>>.");
+			return;
+		}
+
+		TrieBasedModel model = createModel();
+		model.train(sequences);
+		if (GlobalDataContainer.getInstance().addData(modelname,
+				model)) {
+			Console.traceln("Old data \"" + modelname
+					+ "\" overwritten");
+		}
+		
+	}
+
+}
Index: /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainDFA.java
===================================================================
--- /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainDFA.java	(revision 183)
+++ /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainDFA.java	(revision 184)
@@ -1,12 +1,9 @@
 package de.ugoe.cs.eventbench.commands;
 
-import java.security.InvalidParameterException;
 import java.util.List;
 import java.util.Random;
 
-import de.ugoe.cs.eventbench.data.Event;
-import de.ugoe.cs.eventbench.data.GlobalDataContainer;
 import de.ugoe.cs.eventbench.models.DeterministicFiniteAutomaton;
-import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.eventbench.models.TrieBasedModel;
 import de.ugoe.cs.util.console.Console;
 
@@ -17,7 +14,7 @@
  * 
  * @author Steffen Herbold
- * @version 1.0
+ * @version 2.0
  */
-public class CMDtrainDFA implements Command {
+public class CMDtrainDFA extends AbstractTrainCommand {
 
 	/*
@@ -28,5 +25,17 @@
 	@Override
 	public void help() {
-		Console.println("Usage: trainDFA <modelName>");
+		Console.println("Usage: trainDFA <modelName> <sequencesName>");
+	}
+
+	/**
+	 * <p>
+	 * No additional parameters.
+	 * </p>
+	 * 
+	 * @see de.ugoe.cs.eventbench.commands.AbstractTrainCommand#handleAdditionalParameters(java.util.List)
+	 */
+	@Override
+	void handleAdditionalParameters(List<Object> parameters) throws Exception {
+		// no additional parameters.
 	}
 
@@ -34,40 +43,9 @@
 	 * (non-Javadoc)
 	 * 
-	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+	 * @see de.ugoe.cs.eventbench.commands.AbstractTrainCommand#createModel()
 	 */
-	@SuppressWarnings("unchecked")
 	@Override
-	public void run(List<Object> parameters) {
-		String modelname;
-		try {
-			modelname = (String) parameters.get(0);
-		} catch (Exception e) {
-			throw new InvalidParameterException();
-		}
-
-		List<List<Event<?>>> sequences = null;
-		Object dataObject = GlobalDataContainer.getInstance().getData(
-				"sequences");
-
-		try {
-			sequences = (List<List<Event<?>>>) dataObject;
-			if (sequences.size() > 0) {
-				if (sequences.get(0).get(0) instanceof Event) {
-					DeterministicFiniteAutomaton model = new DeterministicFiniteAutomaton(
-							new Random());
-					model.train(sequences);
-					if (GlobalDataContainer.getInstance().addData(modelname,
-							model)) {
-						Console.traceln("Old data \"" + modelname
-								+ "\" overwritten");
-					}
-				} else {
-					Console.traceln("Illegal use of \"sequences\" parameter in the GlobalDataContainer.");
-					Console.traceln("The parameter should always be of type List<List<? extends Event<?>>!");
-				}
-			}
-		} catch (ClassCastException e) {
-			Console.println("Sequences need to be loaded first using parseXML");
-		}
+	TrieBasedModel createModel() {
+		return new DeterministicFiniteAutomaton(new Random());
 	}
 
Index: /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainMarkovModel.java
===================================================================
--- /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainMarkovModel.java	(revision 183)
+++ /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainMarkovModel.java	(revision 184)
@@ -1,13 +1,10 @@
 package de.ugoe.cs.eventbench.commands;
 
-import java.security.InvalidParameterException;
 import java.util.List;
 import java.util.Random;
 
-import de.ugoe.cs.eventbench.data.Event;
-import de.ugoe.cs.eventbench.data.GlobalDataContainer;
 import de.ugoe.cs.eventbench.models.FirstOrderMarkovModel;
 import de.ugoe.cs.eventbench.models.HighOrderMarkovModel;
-import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.eventbench.models.TrieBasedModel;
 import de.ugoe.cs.util.console.Console;
 
@@ -18,7 +15,14 @@
  * 
  * @author Steffen Herbold
- * @version 1.0
+ * @version 2.0
  */
-public class CMDtrainMarkovModel implements Command {
+public class CMDtrainMarkovModel extends AbstractTrainCommand {
+
+	/**
+	 * <p>
+	 * Order of the Markov model.
+	 * </p>
+	 */
+	int order;
 
 	/*
@@ -29,5 +33,19 @@
 	@Override
 	public void help() {
-		Console.println("Usage: trainMarkovModel <modelName> {<order>}");
+		Console.println("Usage: trainMarkovModel <modelName> <sequencesName> {<order>}");
+	}
+
+	/**
+	 * <p>
+	 * Handles the parameter order.
+	 * </p>
+	 * 
+	 * @see de.ugoe.cs.eventbench.commands.AbstractTrainCommand#handleOptionalParameters(java.util.List)
+	 */
+	@Override
+	void handleAdditionalParameters(List<Object> parameters) throws Exception {
+		if (parameters.size() >= 3) {
+			order = Integer.parseInt((String) parameters.get(2));
+		}
 	}
 
@@ -35,47 +53,12 @@
 	 * (non-Javadoc)
 	 * 
-	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+	 * @see de.ugoe.cs.eventbench.commands.AbstractTrainCommand#createModel()
 	 */
-	@SuppressWarnings("unchecked")
 	@Override
-	public void run(List<Object> parameters) {
-		String modelname;
-		int order = 1;
-		try {
-			modelname = (String) parameters.get(0);
-			if (parameters.size() == 2) {
-				order = Integer.parseInt((String) parameters.get(1));
-			}
-		} catch (Exception e) {
-			throw new InvalidParameterException();
-		}
-
-		List<List<Event<?>>> sequences = null;
-		Object dataObject = GlobalDataContainer.getInstance().getData(
-				"sequences");
-
-		try {
-			sequences = (List<List<Event<?>>>) dataObject;
-			if (sequences.size() > 0) {
-				if (sequences.get(0).get(0) instanceof Event) {
-					HighOrderMarkovModel model;
-					if (order == 1) {
-						model = new FirstOrderMarkovModel(new Random());
-					} else {
-						model = new HighOrderMarkovModel(order, new Random());
-					}
-					model.train(sequences);
-					if (GlobalDataContainer.getInstance().addData(modelname,
-							model)) {
-						Console.traceln("Old data \"" + modelname
-								+ "\" overwritten");
-					}
-				} else {
-					Console.traceln("Illegal use of \"sequences\" parameter in the GlobalDataContainer.");
-					Console.traceln("The parameter should always be of type List<List<Event>>!");
-				}
-			}
-		} catch (ClassCastException e) {
-			Console.println("Sequences need to be loaded first using parseXML");
+	TrieBasedModel createModel() {
+		if (order == 1) {
+			return new FirstOrderMarkovModel(new Random());
+		} else {
+			return new HighOrderMarkovModel(order, new Random());
 		}
 	}
Index: /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainPPM.java
===================================================================
--- /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainPPM.java	(revision 183)
+++ /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainPPM.java	(revision 184)
@@ -1,12 +1,9 @@
 package de.ugoe.cs.eventbench.commands;
 
-import java.security.InvalidParameterException;
 import java.util.List;
 import java.util.Random;
 
-import de.ugoe.cs.eventbench.data.Event;
-import de.ugoe.cs.eventbench.data.GlobalDataContainer;
 import de.ugoe.cs.eventbench.models.PredictionByPartialMatch;
-import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.eventbench.models.TrieBasedModel;
 import de.ugoe.cs.util.console.Console;
 
@@ -17,7 +14,28 @@
  * 
  * @author Steffen Herbold
- * @version 1.0
+ * @version 2.0
  */
-public class CMDtrainPPM implements Command {
+public class CMDtrainPPM extends AbstractTrainCommand {
+
+	/**
+	 * <p>
+	 * Escape probability of the PPM model.
+	 * </p>
+	 */
+	double probEscape;
+
+	/**
+	 * <p>
+	 * Maximal Markov order of the PPM model.
+	 * </p>
+	 */
+	int maxOrder;
+
+	/**
+	 * <p>
+	 * Minimal Markov order of the PPM model. Default: 0
+	 * </p>
+	 */
+	int minOrder = 0;
 
 	/*
@@ -28,5 +46,21 @@
 	@Override
 	public void help() {
-		Console.println("Usage: trainPPM <modelName> <probEscape> <maxOrder> {<minOrder>}");
+		Console.println("Usage: trainPPM <modelName> <sequencesName> <probEscape> <maxOrder> {<minOrder>}");
+	}
+
+	/**
+	 * <p>
+	 * Handles the parameters probEscape, maxOrder, and minOrder.
+	 * </p>
+	 * 
+	 * @see de.ugoe.cs.eventbench.commands.AbstractTrainCommand#handleOptionalParameters(java.util.List)
+	 */
+	@Override
+	void handleAdditionalParameters(List<Object> parameters) throws Exception {
+		probEscape = Double.parseDouble((String) parameters.get(2));
+		maxOrder = Integer.parseInt((String) parameters.get(3));
+		if (parameters.size() == 5) {
+			minOrder = Integer.parseInt((String) parameters.get(4));
+		}
 	}
 
@@ -34,48 +68,10 @@
 	 * (non-Javadoc)
 	 * 
-	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+	 * @see de.ugoe.cs.eventbench.commands.AbstractTrainCommand#createModel()
 	 */
-	@SuppressWarnings("unchecked")
 	@Override
-	public void run(List<Object> parameters) {
-		String modelname;
-		double probEscape;
-		int maxOrder;
-		int minOrder = 0;
-		try {
-			modelname = (String) parameters.get(0);
-			probEscape = Double.parseDouble((String) parameters.get(1));
-			maxOrder = Integer.parseInt((String) parameters.get(2));
-			if (parameters.size() == 4) {
-				minOrder = Integer.parseInt((String) parameters.get(3));
-			}
-		} catch (Exception e) {
-			throw new InvalidParameterException();
-		}
-
-		List<List<Event<?>>> sequences = null;
-		Object dataObject = GlobalDataContainer.getInstance().getData(
-				"sequences");
-
-		try {
-			sequences = (List<List<Event<?>>>) dataObject;
-			if (sequences.size() > 0) {
-				if (sequences.get(0).get(0) instanceof Event) {
-					PredictionByPartialMatch model = new PredictionByPartialMatch(
-							maxOrder, minOrder, new Random(), probEscape);
-					model.train(sequences);
-					if (GlobalDataContainer.getInstance().addData(modelname,
-							model)) {
-						Console.traceln("Old data \"" + modelname
-								+ "\" overwritten");
-					}
-				} else {
-					Console.traceln("Illegal use of \"sequences\" parameter in the GlobalDataContainer.");
-					Console.traceln("The parameter should always be of type List<List<Event>>!");
-				}
-			}
-		} catch (ClassCastException e) {
-			Console.println("Sequences need to be loaded first using parseXML");
-		}
+	TrieBasedModel createModel() {
+		return new PredictionByPartialMatch(maxOrder, minOrder, new Random(),
+				probEscape);
 	}
 
Index: /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDupdateModel.java
===================================================================
--- /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDupdateModel.java	(revision 184)
+++ /trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDupdateModel.java	(revision 184)
@@ -0,0 +1,85 @@
+package de.ugoe.cs.eventbench.commands;
+
+import java.security.InvalidParameterException;
+import java.util.List;
+
+import de.ugoe.cs.eventbench.data.Event;
+import de.ugoe.cs.eventbench.data.GlobalDataContainer;
+import de.ugoe.cs.eventbench.models.TrieBasedModel;
+import de.ugoe.cs.util.console.Command;
+import de.ugoe.cs.util.console.Console;
+
+/**
+ * <p>
+ * Command to update a {@link TrieBasedModel}.
+ * </p>
+ * 
+ * @author Steffen Herbold
+ * @version 1.0
+ */
+public class CMDupdateModel implements Command {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#run(java.util.List)
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void run(List<Object> parameters) {
+		String modelname;
+		String sequencesName;
+
+		try {
+			modelname = (String) parameters.get(0);
+			sequencesName = (String) parameters.get(1);
+		} catch (Exception e) {
+			throw new InvalidParameterException();
+		}
+
+		List<List<Event<?>>> sequences = null;
+		Object dataObject = GlobalDataContainer.getInstance().getData(
+				sequencesName);
+		if (dataObject == null) {
+			Console.println("Object " + sequencesName
+					+ " not found in storage.");
+			return;
+		}
+		try {
+			sequences = (List<List<Event<?>>>) dataObject;
+		} catch (ClassCastException e) {
+			Console.println("Object " + sequencesName
+					+ "not of type List<List<Event<?>>>.");
+		}
+		if (sequences.size() == 0
+				|| !(sequences.get(0).get(0) instanceof Event)) {
+			Console.println("Object " + sequencesName
+					+ "not of type List<List<Event<?>>>.");
+			return;
+		}
+
+		dataObject = GlobalDataContainer.getInstance().getData(modelname);
+		if (dataObject == null) {
+			Console.println("Model " + modelname + " not found in storage.");
+			return;
+		}
+		if (!(dataObject instanceof TrieBasedModel)) {
+			Console.println("Object " + modelname
+					+ " not of type TrieBasedModel!");
+			return;
+		}
+		TrieBasedModel model = (TrieBasedModel) dataObject;
+		model.update(sequences);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see de.ugoe.cs.util.console.Command#help()
+	 */
+	@Override
+	public void help() {
+		Console.println("Usage: updateModel <modelname> <sequencesName>");
+	}
+
+}
