Index: /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/Main.java
===================================================================
--- /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/Main.java	(revision 103)
+++ /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/Main.java	(revision 104)
@@ -38,5 +38,5 @@
             InputType sourceType = sourceFile.getName().endsWith(".model") ? InputType.MODEL : InputType.RSF;
             ModelTranslator.translate(sourceFile, destFile, sourceType, resultType, arguments.getComment(),
-                arguments.getVersion());
+                arguments.getVersion(), arguments.getOptimizationParameter());
         }
     }
Index: /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/ModelTranslator.java
===================================================================
--- /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/ModelTranslator.java	(revision 103)
+++ /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/ModelTranslator.java	(revision 104)
@@ -10,4 +10,5 @@
 import de.uni_hildesheim.sse.trans.convert.MaxTermConverter2;
 import de.uni_hildesheim.sse.trans.convert.ModelOptimizer;
+import de.uni_hildesheim.sse.trans.convert.OptimizationParameter;
 import de.uni_hildesheim.sse.trans.in.IModelReader;
 import de.uni_hildesheim.sse.trans.in.InputType;
@@ -47,10 +48,12 @@
      * @param version Optionally the version of the translated model. Can be <tt>null</tt>. If not <tt>null</tt>,
      *     it must be in {@link de.uni_hildesheim.sse.utils.modelManagement.Version#Version(String)} syntax.
+     * @param optimizations Specification which optimizations shall be applied to the transformed model. Will only be
+     *     applied to transformations into CNF.
      */
     public static void translate(File in, Writer out, InputType inType, OutputType outType, String comment,
-        String version) {
+        String version, OptimizationParameter optimizations) {
         
         Project model = readSourceModel(in, inType, outType);
-        transformAndWriteModel(out, outType, comment, version, model);
+        transformAndWriteModel(out, outType, comment, version, model, optimizations);
     }
 
@@ -63,7 +66,9 @@
      *     it must be in {@link de.uni_hildesheim.sse.utils.modelManagement.Version#Version(String)} syntax.
      * @param model The read model.
+     * @param optimizations Specification which optimizations shall be applied to the transformed model. Will only be
+     *     applied to transformations into CNF.
      */
     private static void transformAndWriteModel(Writer out, OutputType outType, String comment, String version,
-        Project model) {
+        Project model, OptimizationParameter optimizations) {
         
         if (null != model) {
@@ -73,4 +78,54 @@
                 LOGGER.info("2.) Write model."); 
                 writer = new IVMLWriter(out, model);
+                break;
+            case DIMCAS:
+                int step = 2;
+                LOGGER.info(step++ + ".) Convert model."); 
+                CNFConverter.convert(model, new MaxTermConverter2());
+                
+                if (optimizations.hasAtLeastOneOption()) {
+                    LOGGER.info(step++ + ".) Optimize model."); 
+                    boolean optimizationApplied = true;
+                    int run = 1;
+
+                    while (optimizationApplied) {
+                        // Initialization
+                        LOGGER.info(run++ + "Optimization run");
+                        ModelOptimizer optimizer = new ModelOptimizer(model);
+                        optimizationApplied = false;
+                        int removed = 0;
+
+                        // Removing unused variables
+                        if (optimizations.removeUnusedVariables()) {
+                            removed = optimizer.removeUnusedVariables();
+                            LOGGER.info("Removed " + removed + " unused variables.");
+                            optimizationApplied |= removed > 0;
+                        }
+                        
+                        // Removing constant "variables"
+                        if (optimizations.eleminateConstants()) {
+                            removed = optimizer.handleConstantVariables();
+                            LOGGER.info("Removed " + removed + " constraints with constant variables.");
+                            optimizationApplied |= removed > 0;
+                        }
+                        
+                        // Duplicated constraints
+                        if (optimizations.removeDuplicatedConstraints()) {
+                            removed = optimizer.removeDuplicatedConstraints();
+                            LOGGER.info("Removed " + removed + " duplicated constraints.");
+                            optimizationApplied |= removed > 0;
+                        }
+                    }
+                }
+                
+                LOGGER.info(step++ + ".) Write model."); 
+                writer = new DimacsWriter(model, out);
+                break;
+            default:
+                LOGGER.debug("Not supported input model specified.");
+                break;
+            }
+            
+            if (null != writer) {
                 writer.write(comment, version);
                 try {
@@ -80,34 +135,4 @@
                     LOGGER.exception(e);
                 }
-                break;
-            case DIMCAS:
-                LOGGER.info("2.) Convert model."); 
-                CNFConverter.convert(model, new MaxTermConverter2());
-                
-                LOGGER.info("3.) Optimize model."); 
-                ModelOptimizer optimizer = new ModelOptimizer(model);
-                
-                int removed = optimizer.removeUnusedVariables();
-                LOGGER.info("Removed " + removed + " unused variables.");
-                
-                removed = optimizer.handleConstantVariables();
-                LOGGER.info("Removed " + removed + " constraints with constant variables.");
-                
-                removed = optimizer.removeDuplicatedConstraints();
-                LOGGER.info("Removed " + removed + " duplicated constraints.");
-                
-                LOGGER.info("4.) Write model."); 
-                writer = new DimacsWriter(model, out);
-                writer.write(comment, version);
-                try {
-                    out.flush();
-                    out.close();
-                } catch (IOException e) {
-                    LOGGER.exception(e);
-                }
-                break;
-            default:
-                LOGGER.debug("Not supported input model specified.");
-                break;
             }
         }
@@ -170,11 +195,13 @@
      * @param version Optionally the version of the translated model. Can be <tt>null</tt>. If not <tt>null</tt>,
      *     it must be in {@link de.uni_hildesheim.sse.utils.modelManagement.Version#Version(String)} syntax.
+     * @param optimizations Specification which optimizations shall be applied to the transformed model. Will only be
+     *     applied to transformations into CNF.
      */
     public static void translate(File in, File out, InputType inType, OutputType outType, String comment,
-        String version) {
+        String version, OptimizationParameter optimizations) {
         
         try {
             FileWriter outWriter = new FileWriter(out);
-            translate(in, outWriter, inType, outType, comment, version);
+            translate(in, outWriter, inType, outType, comment, version, optimizations);
         } catch (IOException e) {
             LOGGER.exception(e);
Index: /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/cli/Arguments.java
===================================================================
--- /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/cli/Arguments.java	(revision 103)
+++ /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/cli/Arguments.java	(revision 104)
@@ -3,6 +3,8 @@
 import java.io.File;
 
+import de.uni_hildesheim.sse.trans.convert.OptimizationParameter;
+
 /**
- * Arguments passed to this programm.
+ * Arguments passed to this program.
  * @author El-Sharkawy
  *
@@ -15,4 +17,5 @@
     private String version;
     private boolean help;
+    private OptimizationParameter optimizations;
     
     /**
@@ -26,4 +29,5 @@
         version = null;
         help = true;
+        optimizations = new OptimizationParameter();
     }
     
@@ -108,4 +112,11 @@
     }
     
+    /**
+     * Returns the selected {@link OptimizationParameter}.
+     * @return The selected {@link OptimizationParameter}, will not be <tt>null</tt>.
+     */
+    public OptimizationParameter getOptimizationParameter() {
+        return optimizations;
+    }
     
 }
Index: /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/cli/ArgumentsParser.java
===================================================================
--- /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/cli/ArgumentsParser.java	(revision 103)
+++ /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/cli/ArgumentsParser.java	(revision 104)
@@ -29,4 +29,8 @@
     private static final String CMD_HELP = "h";
     private static final String CMD_VERSION = "v";
+    private static final String CMD_OPTIMIZATION_ALL = "optAll";
+    private static final String CMD_OPTIMIZATION_UNUSED = "optUnused";
+    private static final String CMD_OPTIMIZATION_DOUBLE = "optDouble";
+    private static final String CMD_OPTIMIZATION_CONSTANTS = "optConstants";
     
     static {
@@ -39,4 +43,16 @@
         OPTIONS.addOption(CMD_HELP, "help", false, "Prints this help instead of perfoming the model translation");
         OPTIONS.addOption(CMD_VERSION, "version", true, "Optional: The version of the source model (in IVML syntax)");
+        OPTIONS.addOption(CMD_OPTIMIZATION_ALL, CMD_OPTIMIZATION_ALL, false, "Optional: Shall all optimizations apllied"
+            + " to the model.\nThis can only be done for a translation into DIMACS format.\n"
+            + "The following arguments will be igorned (turned on):"
+            + "\n - " + CMD_OPTIMIZATION_UNUSED
+            + "\n - " + CMD_OPTIMIZATION_DOUBLE
+            + "\n - " + CMD_OPTIMIZATION_CONSTANTS);
+        OPTIONS.addOption(CMD_OPTIMIZATION_UNUSED, CMD_OPTIMIZATION_UNUSED, false, "Optional:"
+            + "Will remove all unused variables");
+        OPTIONS.addOption(CMD_OPTIMIZATION_DOUBLE, CMD_OPTIMIZATION_DOUBLE, false, "Optional:"
+            + "Will remove duplicated constraints.");
+        OPTIONS.addOption(CMD_OPTIMIZATION_CONSTANTS, CMD_OPTIMIZATION_CONSTANTS, false, "Optional:"
+            + "Will remove constant \"variables\" (which are set to true or false permanetely).");
     }
     
@@ -94,4 +110,20 @@
                 arguments.setHelp(true);
             }
+            // Optimizations
+            if (cmd.hasOption(CMD_OPTIMIZATION_ALL)) {
+                arguments.getOptimizationParameter().setEleminateConstants(true);
+                arguments.getOptimizationParameter().setRemoveDuplicatedConstraints(true);
+                arguments.getOptimizationParameter().setRemoveUnusedVariables(true);
+            } else {
+                if (cmd.hasOption(CMD_OPTIMIZATION_CONSTANTS)) {
+                    arguments.getOptimizationParameter().setEleminateConstants(true);
+                }
+                if (cmd.hasOption(CMD_OPTIMIZATION_DOUBLE)) {
+                    arguments.getOptimizationParameter().setRemoveDuplicatedConstraints(true);
+                }
+                if (cmd.hasOption(CMD_OPTIMIZATION_UNUSED)) {
+                    arguments.getOptimizationParameter().setRemoveUnusedVariables(true);
+                }
+            }
         } catch (ParseException exp) {
             arguments.setHelp(true);
Index: /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/MaxTermConverter2.java
===================================================================
--- /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/MaxTermConverter2.java	(revision 103)
+++ /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/MaxTermConverter2.java	(revision 104)
@@ -79,21 +79,13 @@
             IDecisionVariable decisionVar = config.getDecision(declarationArray[var]);
             
+            // First, try positive solution
             decisionVar.setValue(BooleanValue.TRUE, AssignmentState.ASSIGNED);
             checkConstraint(originalConstraint, declarationArray, config, var);
-//            if (result == 0) {
-//                addExpression(declarationArray, var, config);
-//            } else if (result == -1) {
-//                handleConstraint(originalConstraint, declarationArray, config, var + 1);
-//            }
             
+            // Second, try negative solution
             decisionVar.setValue(BooleanValue.FALSE, AssignmentState.ASSIGNED);
-//            result = checkConstraint(originalConstraint, config);
             checkConstraint(originalConstraint, declarationArray, config, var);
-//            if (result == 0) {
-//                addExpression(declarationArray, var, config);
-//            } else if (result == -1) {
-//                handleConstraint(originalConstraint, declarationArray, config, var + 1);
-//            }
             
+            // third, backtracking
             decisionVar.setValue(null, AssignmentState.UNDEFINED);
             
Index: /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/OptimizationParameter.java
===================================================================
--- /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/OptimizationParameter.java	(revision 104)
+++ /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/OptimizationParameter.java	(revision 104)
@@ -0,0 +1,88 @@
+package de.uni_hildesheim.sse.trans.convert;
+
+/**
+ * Data class for specification which optimizations ({@link ModelOptimizer}) shall be performed.
+ * @author El-Sharkawy
+ *
+ */
+public class OptimizationParameter {
+    
+    private boolean eleminateConstants;
+    private boolean removeUnusedVariables;
+    private boolean removeDuplicatedConstraints;
+    
+    /**
+     * Default constructor, will disable all optimizations.
+     */
+    public OptimizationParameter() {
+        this(false);
+    }
+    
+    /**
+     * Constructor for specifying, whether all optimizations shall be applied or none.
+     * @param allOn <tt>true</tt> all optimizations will be turned on, otherwise all optimizations will be turned off.
+     */
+    public OptimizationParameter(boolean allOn) {
+        eleminateConstants = allOn;
+        removeUnusedVariables = allOn;
+        removeDuplicatedConstraints = allOn;
+    }
+
+    /**
+     * Specification whether Constants shall be removed ({@link ModelOptimizer#handleConstantVariables()}.
+     * @return <tt>true</tt> constants will be removed.
+     */
+    public boolean eleminateConstants() {
+        return eleminateConstants;
+    }
+    
+    /**
+     * Specification whether Constants shall be removed ({@link ModelOptimizer#handleConstantVariables()}.
+     * @param eleminateConstants <tt>true</tt> constants will be removed.
+     */
+    public void setEleminateConstants(boolean eleminateConstants) {
+        this.eleminateConstants = eleminateConstants;
+    }
+    
+    /**
+     * Specification whether unused variables shall be removed ({@link ModelOptimizer#removeUnusedVariables()}.
+     * @return <tt>true</tt> unused variables will be removed.
+     */
+    public boolean removeUnusedVariables() {
+        return removeUnusedVariables;
+    }
+    
+    /**
+     * Specification whether unused variables shall be removed ({@link ModelOptimizer#removeUnusedVariables()}.
+     * @param removeUnusedVariables <tt>true</tt> unused variables will be removed.
+     */
+    public void setRemoveUnusedVariables(boolean removeUnusedVariables) {
+        this.removeUnusedVariables = removeUnusedVariables;
+    }
+    
+    /**
+     * Specification whether duplicated constraints shall be removed
+     * ({@link ModelOptimizer#removeDuplicatedConstraints()}.
+     * @return <tt>true</tt> duplicated constraints will be removed.
+     */
+    public boolean removeDuplicatedConstraints() {
+        return removeDuplicatedConstraints;
+    }
+    
+    /**
+     *  Specification whether duplicated constraints shall be removed
+     * ({@link ModelOptimizer#removeDuplicatedConstraints()}.
+     * @param removeDuplicatedConstraints <tt>true</tt> duplicated constraints will be removed.
+     */
+    public void setRemoveDuplicatedConstraints(boolean removeDuplicatedConstraints) {
+        this.removeDuplicatedConstraints = removeDuplicatedConstraints;
+    }
+    
+    /**
+     * Returns whether at least one option was set to <tt>true</tt>.
+     * @return <tt>true</tt> if at least one option was set to <tt>true</tt>.
+     */
+    public boolean hasAtLeastOneOption() {
+        return eleminateConstants || removeDuplicatedConstraints || removeUnusedVariables;
+    }
+}
