[wip]
diff --git a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/analyzer/AS2CGVisitor.java b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/analyzer/AS2CGVisitor.java
index eac05bd..27c0254 100644
--- a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/analyzer/AS2CGVisitor.java
+++ b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/analyzer/AS2CGVisitor.java
@@ -124,6 +124,7 @@
 import org.eclipse.ocl.examples.pivot.Operation;
 import org.eclipse.ocl.examples.pivot.OperationCallExp;
 import org.eclipse.ocl.examples.pivot.OppositePropertyCallExp;
+import org.eclipse.ocl.examples.pivot.Parameter;
 import org.eclipse.ocl.examples.pivot.Property;
 import org.eclipse.ocl.examples.pivot.PropertyCallExp;
 import org.eclipse.ocl.examples.pivot.RealLiteralExp;
@@ -316,7 +317,10 @@
 			cgParameter = CGModelFactory.eINSTANCE.createCGParameter();
 			context.setNames(cgParameter, aParameter);
 			setAst(cgParameter, aParameter);
-			cgParameter.setTypeId(context.getTypeId(TypeId.OCL_VOID));			// FIXME Java-specific
+//			cgParameter.setTypeId(context.getTypeId(TypeId.OCL_VOID));			// FIXME Java-specific
+			Parameter representedParameter = aParameter.getRepresentedParameter();
+			TypeId typeId = (representedParameter != null ? representedParameter : aParameter).getTypeId();
+			cgParameter.setTypeId(context.getTypeId(typeId));
 			addParameter(aParameter, cgParameter);
 			cgParameter.setRequired(aParameter.isRequired());
 			if (aParameter.isRequired()) {
diff --git a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/generator/TypeDescriptor.java b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/generator/TypeDescriptor.java
index 816b8de..e227e2a 100644
--- a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/generator/TypeDescriptor.java
+++ b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/generator/TypeDescriptor.java
@@ -25,6 +25,7 @@
 import org.eclipse.ocl.examples.codegen.java.JavaStream.SubStream;
 import org.eclipse.ocl.examples.codegen.java.types.CollectionDescriptor;
 import org.eclipse.ocl.examples.codegen.java.types.UnboxedDescriptor;
+import org.eclipse.ocl.examples.domain.ids.ElementId;
 
 /**
  * TypeDescriptor captures the characteristics of a Java type and supports serialization to a javaStream.
@@ -84,6 +85,8 @@
 	 */
 	@Nullable EClassifier getEClassifier();
 
+	@NonNull ElementId getElementId();
+
 	/**
 	 * Return the basic Java class for this descriptor. e.g. List<?> for an unboxed collection.
 	 */
diff --git a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/BooleanObjectDescriptor.java b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/BooleanObjectDescriptor.java
index 41fb817..234c917 100644
--- a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/BooleanObjectDescriptor.java
+++ b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/BooleanObjectDescriptor.java
@@ -51,9 +51,10 @@
 	}
 
 	@Override
-	public void appendEqualsValue(@NonNull JavaStream js, @NonNull CGValuedElement thisValue,
-			@NonNull CGValuedElement thatValue, boolean notEquals) {
-		super.appendEqualsValue(js, thisValue, thatValue, notEquals);
+	public void appendEqualsValue(@NonNull JavaStream js, @NonNull CGValuedElement thisValue, @NonNull CGValuedElement thatValue, boolean notEquals) {
+		js.appendValueName(thisValue);
+		js.append(notEquals ? " != " :  " == ");
+		js.appendValueName(thatValue);
 	}
 
 	@Override
diff --git a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/IntegerObjectDescriptor.java b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/IntegerObjectDescriptor.java
index f3b0cce..63bf62b 100644
--- a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/IntegerObjectDescriptor.java
+++ b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/IntegerObjectDescriptor.java
@@ -15,12 +15,16 @@
 package org.eclipse.ocl.examples.codegen.java.types;
 
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGBoxExp;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGValuedElement;
+import org.eclipse.ocl.examples.codegen.generator.TypeDescriptor;
 import org.eclipse.ocl.examples.codegen.java.JavaLocalContext;
 import org.eclipse.ocl.examples.codegen.java.JavaStream;
+import org.eclipse.ocl.examples.codegen.java.JavaStream.SubStream;
 import org.eclipse.ocl.examples.domain.ids.ElementId;
 import org.eclipse.ocl.examples.domain.values.util.ValuesUtil;
+import org.eclipse.ocl.examples.pivot.manager.MetaModelManager;
 
 /**
  * An IntegerObjectDescriptor describes the unboxed representations of an OCL Integer.
@@ -46,4 +50,12 @@
 		js.append(";\n");
 		return true;
 	}
+
+	@Override
+	public void appendEqualsValue(@NonNull JavaStream js, @NonNull CGValuedElement thisValue, @NonNull CGValuedElement thatValue, boolean notEquals) {
+		TypeDescriptor thatTypeDescriptor = js.getCodeGenerator().getTypeDescriptor(thatValue);
+		js.appendValueName(thisValue);
+		js.append(notEquals ? " != " :  " == ");
+		js.appendValueName(thatValue);
+	}
 }
\ No newline at end of file
diff --git a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/IntegerValueDescriptor.java b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/IntegerValueDescriptor.java
index acb4d55..4c8c3e9 100644
--- a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/IntegerValueDescriptor.java
+++ b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/IntegerValueDescriptor.java
@@ -15,10 +15,13 @@
 package org.eclipse.ocl.examples.codegen.java.types;
 
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGUnboxExp;
 import org.eclipse.ocl.examples.codegen.cgmodel.CGValuedElement;
+import org.eclipse.ocl.examples.codegen.generator.TypeDescriptor;
 import org.eclipse.ocl.examples.codegen.java.JavaLocalContext;
 import org.eclipse.ocl.examples.codegen.java.JavaStream;
+import org.eclipse.ocl.examples.codegen.java.JavaStream.SubStream;
 import org.eclipse.ocl.examples.domain.ids.ElementId;
 import org.eclipse.ocl.examples.domain.values.IntegerValue;
 
@@ -32,6 +35,36 @@
 	}
 
 	@Override
+	public void appendCast(@NonNull JavaStream js,
+			@Nullable Class<?> actualJavaClass, @Nullable SubStream subStream) {
+		// TODO Auto-generated method stub
+		super.appendCast(js, actualJavaClass, subStream);
+	}
+
+	@Override
+	public void appendCastTerm(@NonNull JavaStream js,
+			@NonNull CGValuedElement cgElement) {
+		// TODO Auto-generated method stub
+		super.appendCastTerm(js, cgElement);
+	}
+
+	@Override
+	public void appendNotEqualsTerm(@NonNull JavaStream js,
+			@NonNull CGValuedElement thisValue,
+			@NonNull TypeDescriptor thatTypeDescriptor, @NonNull String thatName) {
+		// TODO Auto-generated method stub
+		super.appendNotEqualsTerm(js, thisValue, thatTypeDescriptor, thatName);
+	}
+
+	@Override
+	public void appendEqualsValue(@NonNull JavaStream js,
+			@NonNull CGValuedElement thisValue,
+			@NonNull CGValuedElement thatValue, boolean notEquals) {
+		// TODO Auto-generated method stub
+		super.appendEqualsValue(js, thisValue, thatValue, notEquals);
+	}
+
+	@Override
 	public @NonNull Boolean appendUnboxStatements(@NonNull JavaStream js, @NonNull JavaLocalContext localContext,
 			@NonNull CGUnboxExp cgUnboxExp, @NonNull CGValuedElement boxedValue) {
 		js.appendDeclaration(cgUnboxExp);
diff --git a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/RealObjectDescriptor.java b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/RealObjectDescriptor.java
index a99694d..7fcda59 100644
--- a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/RealObjectDescriptor.java
+++ b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/RealObjectDescriptor.java
@@ -46,4 +46,11 @@
 		js.append(";\n");
 		return true;
 	}
+
+	@Override
+	public void appendEqualsValue(@NonNull JavaStream js, @NonNull CGValuedElement thisValue, @NonNull CGValuedElement thatValue, boolean notEquals) {
+		js.appendValueName(thisValue);
+		js.append(notEquals ? " != " :  " == ");
+		js.appendValueName(thatValue);
+	}
 }
\ No newline at end of file
diff --git a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/UnlimitedNaturalObjectDescriptor.java b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/UnlimitedNaturalObjectDescriptor.java
index 9826fe7..5a5a67e 100644
--- a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/UnlimitedNaturalObjectDescriptor.java
+++ b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/java/types/UnlimitedNaturalObjectDescriptor.java
@@ -46,4 +46,11 @@
 		js.append(";\n");
 		return true;
 	}
+
+	@Override
+	public void appendEqualsValue(@NonNull JavaStream js, @NonNull CGValuedElement thisValue, @NonNull CGValuedElement thatValue, boolean notEquals) {
+		js.appendValueName(thisValue);
+		js.append(notEquals ? " != " :  " == ");
+		js.appendValueName(thatValue);
+	}
 }
\ No newline at end of file
diff --git a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/oclinecore/OCLinEcoreCG2JavaVisitor.java b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/oclinecore/OCLinEcoreCG2JavaVisitor.java
index e28eabc..05e956a 100644
--- a/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/oclinecore/OCLinEcoreCG2JavaVisitor.java
+++ b/examples/org.eclipse.ocl.examples.codegen/src/org/eclipse/ocl/examples/codegen/oclinecore/OCLinEcoreCG2JavaVisitor.java
@@ -76,7 +76,7 @@
 		Map<String, String> bodies = new HashMap<String, String>();
 		for (CGClass cgClass : cgPackage.getClasses()) {
 			for (CGConstraint cgConstraint : cgClass.getInvariants()) {
-				if ("Pseudostate".equals(cgClass.getName())) {
+				if ("MultiplicityElement".equals(cgClass.getName())) {
 					System.out.println("got it");
 				}
 				CGValuedElement cgBody = cgConstraint.getBody();
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/plugin.xml b/tests/org.eclipse.ocl.examples.xtext.tests/plugin.xml
index 28f93bd..6498d47 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/plugin.xml
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/plugin.xml
@@ -74,6 +74,12 @@
    </extension>
 
    <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated Bug412736a NOT -->
+      <!--package uri="http://bug412736a" class="bug412736a.Bug412736aPackage"/-->
+      <package uri="dummy-protocol://dummy-nsuri/bug412736a" class="codegen.company.CodegencompanyPackage"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
       <!-- @generated Bug414855 NOT -->
       <!--package uri="http://bug414855" class="bug414855.Bug414855Package"/-->
       <package uri="dummy-protocol://dummy-nsuri/bug414855" class="codegen.company.CodegencompanyPackage"/>
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/UsageTests.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/UsageTests.java
index 7a353db..d6ea5a7 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/UsageTests.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/UsageTests.java
@@ -613,6 +613,7 @@
 			+ "        attribute eShortObject : ecore::EShortObject { derived readonly volatile } { derivation: negEShortObject(1); }\n"
 			+ "        attribute eShort : ecore::EShort { derived readonly volatile } { derivation: negEShort(1); }\n"
 			+ "        attribute eString : ecore::EString { derived readonly volatile } { derivation: upCase('abc'); }\n"
+			+ "        operation eqEInt(a : ecore::EInt, b : ecore::EInt) : ecore::EBoolean { body: a = b; }\n"
 			+ "        operation negEBigDecimal(b : ecore::EBigDecimal) : ecore::EBigDecimal { body: -b; }\n"
 			+ "        operation negEBigInteger(b : ecore::EBigInteger) : ecore::EBigInteger { body: -b; }\n"
 			+ "        operation negEChar(b : ecore::EChar) : ecore::EChar { body: -b; }\n"
@@ -657,6 +658,24 @@
 		}
 	}
 
+	public void testEcoreTypes412736a() throws Exception {
+		String testFileStem = "Bug412736a";
+		String testProjectName = "bug412736a";
+		String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS;
+		String oclinecoreFile = "import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';\n"
+			+ "package bug412736a : bug412736a = 'http://bug412736a'\n"
+			+ "{\n"
+			+ "    class EcoreDataTypes\n"
+			+ "    {\n"
+			+ "        operation eqEInt(a : ecore::EInt, b : ecore::EInt) : ecore::EBoolean { body: a = b; }\n"
+			+ "    }\n" + "}\n";
+		String genmodelFile = createGenModelContent(testProjectPath, "Bug412736a", null);
+		doDelete(testProjectName);
+		URI fileURI = createModels(testProjectPath, testFileStem, oclinecoreFile, genmodelFile);
+		doGenModel(testProjectPath, fileURI);
+		doCompile(testProjectName);
+	}
+
 	public void testEnumTypes412685() throws Exception {
 		String testFileStem = "Bug412685";
 		String testProjectName = "bug412685";