Index: /ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/MaxTermConverter.java
===================================================================
--- /ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/MaxTermConverter.java	(revision 424)
+++ /ModelTranslator/src/de/uni_hildesheim/sse/trans/convert/MaxTermConverter.java	(revision 425)
@@ -86,4 +86,5 @@
             OCLFeatureCall call = (OCLFeatureCall) originalConstraint;
             if (call.getOperation().equals(OclKeyWords.AND)) {
+                LOGGER.info("highest operation is an AND");
                 createCNFParts(call.getOperand());
                 createCNFParts(call.getParameter(0));
@@ -92,15 +93,21 @@
         }
         
-        // Handle an OR with an AND at one side TODO: handle !AND
+        // Handle an OR with an AND at one side
         if (!handled && originalConstraint instanceof OCLFeatureCall) {
-            OCLFeatureCall call = (OCLFeatureCall) originalConstraint;
-            if (call.getOperation().equals(OclKeyWords.OR)) {
-                if (call.getOperand() instanceof OCLFeatureCall) {
-                    OCLFeatureCall operand = (OCLFeatureCall) call.getOperand();
-                    if (operand.getOperation().equals(OclKeyWords.AND)) {
-                        OCLFeatureCall call1 = new OCLFeatureCall(operand.getOperand(),
-                                OclKeyWords.OR, call.getParameter(0));
-                        OCLFeatureCall call2 = new OCLFeatureCall(operand.getParameter(0),
-                                OclKeyWords.OR, call.getParameter(0));
+            OCLFeatureCall highestOperation = (OCLFeatureCall) originalConstraint;
+            
+            // if highest operation is an OR
+            if (highestOperation.getOperation().equals(OclKeyWords.OR)) {
+                LOGGER.info("highest operation is an OR");
+                if (highestOperation.getOperand() instanceof OCLFeatureCall) {
+                    OCLFeatureCall leftOperation = (OCLFeatureCall) highestOperation.getOperand();
+                    
+                    // if the left side of the OR is an AND
+                    if (leftOperation.getOperation().equals(OclKeyWords.AND)) {
+                        LOGGER.info("left side is an and");
+                        OCLFeatureCall call1 = new OCLFeatureCall(leftOperation.getOperand(),
+                                OclKeyWords.OR, highestOperation.getParameter(0));
+                        OCLFeatureCall call2 = new OCLFeatureCall(leftOperation.getParameter(0),
+                                OclKeyWords.OR, highestOperation.getParameter(0));
                         
                         createCNFParts(call1);
@@ -108,13 +115,56 @@
                         handled = true;
                     }
+                    
+                    // if the left side of the OR is a NOT
+                    if (!handled && leftOperation.getOperation().equals(OclKeyWords.NOT)) {
+                        LOGGER.info("left side is a NOT");
+                        if (leftOperation.getOperand() instanceof OCLFeatureCall) {
+                            OCLFeatureCall negatedOperation = (OCLFeatureCall) leftOperation.getOperand();
+                            
+                            // if the operation inside the NOT is an AND
+                            if (negatedOperation.getOperation().equals(OclKeyWords.AND)) {
+                                LOGGER.info("negated operation is an AND");
+                                
+                                // expand the NOT into the and call
+                                OCLFeatureCall newOperand2 = new OCLFeatureCall(
+                                        new OCLFeatureCall(negatedOperation.getOperand(), OclKeyWords.NOT),
+                                        OclKeyWords.OR,
+                                        new OCLFeatureCall(negatedOperation.getParameter(0), OclKeyWords.NOT));
+                                
+                                OCLFeatureCall newCall = new OCLFeatureCall(newOperand2,
+                                        OclKeyWords.OR, highestOperation.getParameter(0));
+                                createCNFParts(newCall);
+                                handled = true;
+                            }
+                            
+                            // if the operation inside the NOT is an OR
+                            if (negatedOperation.getOperation().equals(OclKeyWords.OR)) {
+                                LOGGER.info("negated operation is an OR");
+                                
+                                // expand the NOT into the and call
+                                OCLFeatureCall newOperand2 = new OCLFeatureCall(
+                                        new OCLFeatureCall(negatedOperation.getOperand(), OclKeyWords.NOT),
+                                        OclKeyWords.AND,
+                                        new OCLFeatureCall(negatedOperation.getParameter(0), OclKeyWords.NOT));
+                                
+                                OCLFeatureCall newCall = new OCLFeatureCall(newOperand2,
+                                        OclKeyWords.OR, highestOperation.getParameter(0));
+                                createCNFParts(newCall);
+                                handled = true;
+                            }
+                        }
+                    }
                 }
                 
-                if (!handled && call.getParameter(0) instanceof OCLFeatureCall) {
-                    OCLFeatureCall parameter = (OCLFeatureCall) call.getParameter(0);
-                    if (parameter.getOperation().equals(OclKeyWords.AND)) {
-                        OCLFeatureCall call1 = new OCLFeatureCall(parameter.getOperand(),
-                                OclKeyWords.OR, call.getOperand());
-                        OCLFeatureCall call2 = new OCLFeatureCall(parameter.getParameter(0),
-                                OclKeyWords.OR, call.getOperand());
+                if (!handled && highestOperation.getParameter(0) instanceof OCLFeatureCall) {
+                    OCLFeatureCall rightSide = (OCLFeatureCall) highestOperation.getParameter(0);
+                    
+                    // if the right side of the call is an AND
+                    if (rightSide.getOperation().equals(OclKeyWords.AND)) {
+                        LOGGER.info("right side is an AND");
+                        OCLFeatureCall call1 = new OCLFeatureCall(rightSide.getOperand(),
+                                OclKeyWords.OR, highestOperation.getOperand());
+                        OCLFeatureCall call2 = new OCLFeatureCall(rightSide.getParameter(0),
+                                OclKeyWords.OR, highestOperation.getOperand());
                         
                         createCNFParts(call1);
@@ -122,5 +172,46 @@
                         handled = true;
                     }
+                    
+                    // if the right side of the OR is a NOT
+                    if (!handled && rightSide.getOperation().equals(OclKeyWords.NOT)) {
+                        LOGGER.info("right side is a NOT");
+                        if (rightSide.getOperand() instanceof OCLFeatureCall) {
+                            OCLFeatureCall negatedOperation = (OCLFeatureCall) rightSide.getOperand();
+                            
+                            // if the operation inside the NOT is an AND
+                            if (negatedOperation.getOperation().equals(OclKeyWords.AND)) {
+                                LOGGER.info("negated operation is an AND");
+                                
+                                // expand the NOT into the and call
+                                OCLFeatureCall newOperand2 = new OCLFeatureCall(
+                                        new OCLFeatureCall(negatedOperation.getOperand(), OclKeyWords.NOT),
+                                        OclKeyWords.OR,
+                                        new OCLFeatureCall(negatedOperation.getParameter(0), OclKeyWords.NOT));
+                                
+                                OCLFeatureCall newCall = new OCLFeatureCall(newOperand2,
+                                        OclKeyWords.OR, highestOperation.getOperand());
+                                createCNFParts(newCall);
+                                handled = true;
+                            }
+                            
+                            // if the operation inside the NOT is an OR
+                            if (negatedOperation.getOperation().equals(OclKeyWords.OR)) {
+                                LOGGER.info("negated operation is an OR");
+                                
+                                // expand the NOT into the and call
+                                OCLFeatureCall newOperand2 = new OCLFeatureCall(
+                                        new OCLFeatureCall(negatedOperation.getOperand(), OclKeyWords.NOT),
+                                        OclKeyWords.AND,
+                                        new OCLFeatureCall(negatedOperation.getParameter(0), OclKeyWords.NOT));
+                                
+                                OCLFeatureCall newCall = new OCLFeatureCall(highestOperation.getOperand(),
+                                        OclKeyWords.OR, newOperand2);
+                                createCNFParts(newCall);
+                                handled = true;
+                            }
+                        }
+                    }
                 }
+                
             }
         }
