Index: /ModelTranslator/resources/testdata/input/testModel_tristateChoices.rsf
===================================================================
--- /ModelTranslator/resources/testdata/input/testModel_tristateChoices.rsf	(revision 406)
+++ /ModelTranslator/resources/testdata/input/testModel_tristateChoices.rsf	(revision 406)
@@ -0,0 +1,9 @@
+#startchoice
+Choice	CHOICE	required	tristate
+#choice value
+ChoiceItem	ITEM1	CHOICE
+Item	ITEM1	tristate
+#choice value
+ChoiceItem	ITEM2	CHOICE
+Item	ITEM2	tristate
+#endchoice
Index: /ModelTranslator/src/de/uni_hildesheim/sse/trans/in/rsf/RSFChoice.java
===================================================================
--- /ModelTranslator/src/de/uni_hildesheim/sse/trans/in/rsf/RSFChoice.java	(revision 405)
+++ /ModelTranslator/src/de/uni_hildesheim/sse/trans/in/rsf/RSFChoice.java	(revision 406)
@@ -10,4 +10,6 @@
 import de.uni_hildesheim.sse.trans.in.AbstractReader;
 import de.uni_hildesheim.sse.trans.in.ParserException;
+import de.uni_hildesheim.sse.utils.logger.EASyLoggerFactory;
+import de.uni_hildesheim.sse.utils.logger.EASyLoggerFactory.EASyLogger;
 
 /**
@@ -19,4 +21,5 @@
  */
 class RSFChoice extends RSFCondition {
+    private static final EASyLogger LOGGER = EASyLoggerFactory.INSTANCE.getLogger(RSFChoice.class, "RSFChoice");
     
     private RSFItem choiceItem;
@@ -115,5 +118,4 @@
     @Override
     List<ConstraintSyntaxTree> toPureBooleanConstraintSyntaxTree(RSFReader reader) throws ParserException {
-        //ConstraintSyntaxTree[] trees = new ConstraintSyntaxTree[choiceItems.size()];
         List<ConstraintSyntaxTree> trees = new ArrayList<ConstraintSyntaxTree>();
         
@@ -145,4 +147,44 @@
         trees.add(allItemsTree);
         
+        if (choiceItem.getDatatype().equals(Datatype.TRISTATE)) {
+            trees.addAll(getModulePart(reader));
+        }
+        
+        return trees;
+    }
+    
+    /**
+     * Creates the additional constraints needed when the choice is a tristate.
+     * @param reader The reader to get variables from.
+     * @return A list with all conditions.
+     */
+    private List<ConstraintSyntaxTree> getModulePart(RSFReader reader) {
+        List<ConstraintSyntaxTree> trees = new ArrayList<ConstraintSyntaxTree>();
+        
+        ConstraintSyntaxTree choiceVar = getSelectedVariable(choiceItem, reader);
+        ConstraintSyntaxTree notChoiceVar = getUnselectedVariable(choiceItem, reader);
+        
+        ConstraintSyntaxTree choiceModuleVar = varPool.obtainVariable(
+                reader.getVariable(choiceItem.getName() + "_MODULE"));
+        ConstraintSyntaxTree notChoiceModuleVar = new OCLFeatureCall(choiceModuleVar, OclKeyWords.NOT);
+        
+        // for each choiceItem
+        for (int i = 0; i < choiceItems.size(); i++) {
+            RSFItem currentItem = choiceItems.get(i); 
+            
+            if (!currentItem.getDatatype().equals(Datatype.TRISTATE)) {
+                LOGGER.error("tristate choice has non-tristate ChoiceItems");
+            }
+            ConstraintSyntaxTree notItem = getUnselectedVariable(currentItem, reader);
+            ConstraintSyntaxTree itemModule = varPool.obtainVariable(
+                    reader.getVariable(currentItem.getName() + "_MODULE"));
+            ConstraintSyntaxTree notItemModule = new OCLFeatureCall(itemModule, OclKeyWords.NOT);
+            
+            trees.add(new OCLFeatureCall(choiceModuleVar, OclKeyWords.OR, notItemModule));
+            trees.add(new OCLFeatureCall(notChoiceVar, OclKeyWords.OR, notItemModule));
+            trees.add(new OCLFeatureCall(notChoiceModuleVar, OclKeyWords.OR, notItem));
+            
+        }
+        
         return trees;
     }
Index: /ModelTranslator/test/de/uni_hildesheim/sse/trans/scenario/RsfToDimacsTranslationTest.java
===================================================================
--- /ModelTranslator/test/de/uni_hildesheim/sse/trans/scenario/RsfToDimacsTranslationTest.java	(revision 405)
+++ /ModelTranslator/test/de/uni_hildesheim/sse/trans/scenario/RsfToDimacsTranslationTest.java	(revision 406)
@@ -245,5 +245,4 @@
         // Translation
         String result = DimacsTestUtils.loadModel(input, noOptimization, true);
-        System.out.println(result);
         
         int choice12 = DimacsTestUtils.getNumberOfVariable(result, "CHOICE_12");
@@ -296,4 +295,41 @@
         Assert.assertTrue("Error: Missing constraint", 
                 DimacsTestUtils.containsConstraint(result, -choice12, a, b, c, d));
+    }
+    
+    /**
+     * Tests whether tristate choices are translated correctly into CNF.
+     */
+    @Test
+    public void testTristateChoices() {
+        File input = new File(AllTests.INPUT_FOLDER, "testModel_tristateChoices.rsf");
+        OptimizationParameter noOptimization = new OptimizationParameter();
+        
+        // Test precondition
+        Assert.assertFalse(noOptimization.hasAtLeastOneOption());
+        
+        // Translation
+        String result = DimacsTestUtils.loadModel(input, noOptimization, true);
+        
+        int choice = DimacsTestUtils.getNumberOfVariable(result, "CHOICE");
+        int item1 = DimacsTestUtils.getNumberOfVariable(result, "ITEM1");
+        int item2 = DimacsTestUtils.getNumberOfVariable(result, "ITEM2");
+        int choiceModule = DimacsTestUtils.getNumberOfVariable(result, "CHOICE_MODULE");
+        int item1Module = DimacsTestUtils.getNumberOfVariable(result, "ITEM1_MODULE");
+        int item2Module = DimacsTestUtils.getNumberOfVariable(result, "ITEM2_MODULE");
+        
+        Assert.assertTrue("Error: Missing constraint",
+                DimacsTestUtils.containsConstraint(result, choiceModule, -item1Module));
+        Assert.assertTrue("Error: Missing constraint",
+                DimacsTestUtils.containsConstraint(result, choiceModule, -item2Module));
+        
+        Assert.assertTrue("Error: Missing constraint",
+                DimacsTestUtils.containsConstraint(result, -choice, -item1Module));
+        Assert.assertTrue("Error: Missing constraint",
+                DimacsTestUtils.containsConstraint(result, -choice, -item2Module));
+        
+        Assert.assertTrue("Error: Missing constraint",
+                DimacsTestUtils.containsConstraint(result, -choiceModule, -item1));
+        Assert.assertTrue("Error: Missing constraint",
+                DimacsTestUtils.containsConstraint(result, -choiceModule, -item2));
     }
     
