Index: /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/ModelTranslator.java
===================================================================
--- /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/ModelTranslator.java	(revision 89)
+++ /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/ModelTranslator.java	(revision 90)
@@ -9,4 +9,5 @@
 import de.uni_hildesheim.sse.trans.convert.CNFConverter;
 import de.uni_hildesheim.sse.trans.convert.MaxTermConverter2;
+import de.uni_hildesheim.sse.trans.convert.UnusedVariableChecker;
 import de.uni_hildesheim.sse.trans.in.IModelReader;
 import de.uni_hildesheim.sse.trans.in.InputType;
@@ -82,4 +83,9 @@
                 CNFConverter.convert(model, new MaxTermConverter2());
                 System.out.println("Conversion completed.");
+                
+                UnusedVariableChecker checker = new UnusedVariableChecker(model);
+                int removed = checker.removeUnusedVariables();
+                System.out.println("Optimizing completed (" + removed + " variables removed).");
+                
                 writer = new DimacsWriter(model, out);
                 writer.write(comment, version);
@@ -90,4 +96,5 @@
                     LOGGER.exception(e);
                 }
+                System.out.println("Writing completed.");
                 break;
             default:
Index: /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/UnusedVariableChecker.java
===================================================================
--- /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/UnusedVariableChecker.java	(revision 89)
+++ /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/UnusedVariableChecker.java	(revision 90)
@@ -1,20 +1,16 @@
 package de.uni_hildesheim.sse.trans.convert;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
-import de.uni_hildesheim.sse.model.cst.ConstraintSyntaxTree;
-import de.uni_hildesheim.sse.model.cst.OCLFeatureCall;
-import de.uni_hildesheim.sse.model.cst.Variable;
 import de.uni_hildesheim.sse.model.varModel.AbstractVariable;
 import de.uni_hildesheim.sse.model.varModel.Constraint;
 import de.uni_hildesheim.sse.model.varModel.Project;
-import de.uni_hildesheim.sse.model.varModel.datatypes.OclKeyWords;
 import de.uni_hildesheim.sse.model.varModel.filter.ConstraintFinder;
 import de.uni_hildesheim.sse.model.varModel.filter.DeclarationFinder;
 import de.uni_hildesheim.sse.model.varModel.filter.DeclarationFinder.VisibilityType;
+import de.uni_hildesheim.sse.model.varModel.filter.DeclrationInConstraintFinder;
 import de.uni_hildesheim.sse.model.varModel.filter.FilterType;
-import de.uni_hildesheim.sse.trans.Bundle;
-import de.uni_hildesheim.sse.utils.logger.EASyLoggerFactory;
-import de.uni_hildesheim.sse.utils.logger.EASyLoggerFactory.EASyLogger;
 
 /**
@@ -24,6 +20,4 @@
  */
 public class UnusedVariableChecker {
-    private static final EASyLogger LOGGER = EASyLoggerFactory.INSTANCE.getLogger(
-            UnusedVariableChecker.class, Bundle.ID);
 
     private Project model;
@@ -47,39 +41,25 @@
         
         List<AbstractVariable> varList = varFinder.getVariableDeclarations(VisibilityType.ALL);
+        Set<AbstractVariable> varSet = new HashSet<AbstractVariable>(varList);
         
-        for (Constraint constraint : cFinder.getConstraints()) {
-            removeVariables(constraint.getConsSyntax(), varList);
+        List<Constraint> constraints = cFinder.getConstraints();
+        for (int i = 0, n = constraints.size(); i < n; i++) {
+            Constraint constraint = constraints.get(i);
+            DeclrationInConstraintFinder finder = new DeclrationInConstraintFinder(constraint.getConsSyntax());
+            Set<AbstractVariable> declarations = finder.getDeclarations();
+            varSet.removeAll(declarations);
+            
+            /*
+             *  Release constraint to deallocate memory.
+             *  set(index, null) avoids Array.copy
+             */
+            constraints.set(i, null);
         }
         
-        for (AbstractVariable var : varList) {
+        for (AbstractVariable var : varSet) {
             model.removeElement(var);
         }
         
-        return varList.size();
-    }
-    
-    /**
-     * Searches all variables in the {@link ConstraintSyntaxTree} and removes them from the variable list.
-     * Assumes the {@link ConstraintSyntaxTree} to only consist of variables, ANDs, ORs and NOTs.
-     * @param tree The {@link ConstraintSyntaxTree} where variables are searched
-     * @param variables The list where variables are removed
-     */
-    private void removeVariables(ConstraintSyntaxTree tree, List<AbstractVariable> variables) {
-        if (tree instanceof Variable) {
-            AbstractVariable variable = ((Variable) tree).getVariable();
-            variables.remove(variable);
-        } else if (tree instanceof OCLFeatureCall) {
-            OCLFeatureCall call = (OCLFeatureCall) tree;
-            if (call.getOperation().equals(OclKeyWords.OR) || call.getOperation().equals(OclKeyWords.AND)) {
-                removeVariables(call.getParameter(0), variables);
-                removeVariables(call.getOperand(), variables);
-            } else if (call.getOperation().equals(OclKeyWords.NOT)) {
-                removeVariables(call.getOperand(), variables);
-            } else {
-                LOGGER.debug("Unexpected Operation in model... skipping"); // TODO
-            }
-        } else {
-            LOGGER.debug("Unexpected ConstraintSyntaxTree in model... skipping"); // TODO
-        }
+        return varSet.size();
     }
     
