Index: /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/UnusedVariableChecker.java
===================================================================
--- /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/UnusedVariableChecker.java	(revision 88)
+++ /Code/ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/UnusedVariableChecker.java	(revision 88)
@@ -0,0 +1,86 @@
+package de.uni_hildesheim.sse.trans.convert;
+
+import java.util.List;
+
+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.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;
+
+/**
+ * Checks a given model for unused variables (i.e. variables that are not used in constraints).
+ * 
+ * @author Adam Krafczyk
+ */
+public class UnusedVariableChecker {
+    private static final EASyLogger LOGGER = EASyLoggerFactory.INSTANCE.getLogger(
+            UnusedVariableChecker.class, Bundle.ID);
+
+    private Project model;
+    
+    /**
+     * Creates a {@link UnusedVariableChecker} for the given project.
+     * @param model The project to be checked by this checker
+     */
+    public UnusedVariableChecker(Project model) {
+        this.model = model;
+    }
+    
+    /**
+     * Removes all unused variables (i.e. variables that are not used in constraints) from the project.
+     * 
+     * @return The number of removed variables.
+     */
+    public int removeUnusedVariables() {
+        ConstraintFinder cFinder = new ConstraintFinder(model);
+        DeclarationFinder varFinder = new DeclarationFinder(model, FilterType.ALL, null);
+        
+        List<AbstractVariable> varList = varFinder.getVariableDeclarations(VisibilityType.ALL);
+        
+        for (Constraint constraint : cFinder.getConstraints()) {
+            removeVariables(constraint.getConsSyntax(), varList);
+        }
+        
+        for (AbstractVariable var : varList) {
+            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
+        }
+    }
+    
+}
Index: /Code/ModelTranslator/test/de/uni_hildesheim/sse/trans/AllTests.java
===================================================================
--- /Code/ModelTranslator/test/de/uni_hildesheim/sse/trans/AllTests.java	(revision 87)
+++ /Code/ModelTranslator/test/de/uni_hildesheim/sse/trans/AllTests.java	(revision 88)
@@ -10,4 +10,5 @@
 import de.uni_hildesheim.sse.trans.convert.MaxTermConverter2Test;
 import de.uni_hildesheim.sse.trans.convert.MaxTermConverterTest;
+import de.uni_hildesheim.sse.trans.convert.UnusedVariableCheckerTest;
 import de.uni_hildesheim.sse.trans.in.ModelReaderTest;
 import de.uni_hildesheim.sse.trans.in.rsf.RSFReaderTest;
@@ -25,4 +26,5 @@
     RSFReaderTest.class,
     DisjunctionCheckerTest.class,
+    UnusedVariableCheckerTest.class,
     MaxTermConverterTest.class,
     MaxTermConverter2Test.class,
Index: /Code/ModelTranslator/test/de/uni_hildesheim/sse/trans/convert/UnusedVariableCheckerTest.java
===================================================================
--- /Code/ModelTranslator/test/de/uni_hildesheim/sse/trans/convert/UnusedVariableCheckerTest.java	(revision 88)
+++ /Code/ModelTranslator/test/de/uni_hildesheim/sse/trans/convert/UnusedVariableCheckerTest.java	(revision 88)
@@ -0,0 +1,54 @@
+package de.uni_hildesheim.sse.trans.convert;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import de.uni_hildesheim.sse.model.cst.CSTSemanticException;
+import de.uni_hildesheim.sse.model.cst.OCLFeatureCall;
+import de.uni_hildesheim.sse.model.cst.Variable;
+import de.uni_hildesheim.sse.model.varModel.Constraint;
+import de.uni_hildesheim.sse.model.varModel.DecisionVariableDeclaration;
+import de.uni_hildesheim.sse.model.varModel.Project;
+import de.uni_hildesheim.sse.model.varModel.datatypes.BooleanType;
+import de.uni_hildesheim.sse.model.varModel.datatypes.OclKeyWords;
+
+/**
+ * Tests the {@link UnusedVariableChecker}.
+ * 
+ * @author Adam Krafczyk
+ */
+public class UnusedVariableCheckerTest {
+
+    /**
+     * Tests the removeUnusedVariables() method.
+     * 
+     * @throws CSTSemanticException can't happen.
+     */
+    @Test
+    public void testRemoveUnusedVariables() throws CSTSemanticException {
+        Project model = new Project("TestModel");
+        
+        DecisionVariableDeclaration declA = new DecisionVariableDeclaration("a", BooleanType.TYPE, null);
+        DecisionVariableDeclaration declB = new DecisionVariableDeclaration("b", BooleanType.TYPE, null);
+        DecisionVariableDeclaration declC = new DecisionVariableDeclaration("c", BooleanType.TYPE, null);
+        DecisionVariableDeclaration declD = new DecisionVariableDeclaration("d", BooleanType.TYPE, null);
+        
+        model.add(declA);
+        model.add(declB);
+        model.add(declC);
+        model.add(declD);
+        
+        Variable varA = new Variable(declA);
+        Variable varB = new Variable(declB);
+        
+        OCLFeatureCall term = new OCLFeatureCall(varA, OclKeyWords.OR, varB);
+        
+        Constraint constraint = new Constraint(model);
+        constraint.setConsSyntax(term);
+        model.add(constraint);
+        
+        UnusedVariableChecker checker = new UnusedVariableChecker(model);
+        Assert.assertEquals(2, checker.removeUnusedVariables());
+    }
+    
+}
