[535888] Regenerate, eliminate usage of ExpCS.precedence
diff --git a/plugins/org.eclipse.ocl.pivot/.settings/.api_filters b/plugins/org.eclipse.ocl.pivot/.settings/.api_filters
index 994ad9a..3e924b2 100644
--- a/plugins/org.eclipse.ocl.pivot/.settings/.api_filters
+++ b/plugins/org.eclipse.ocl.pivot/.settings/.api_filters
@@ -582,6 +582,34 @@
             </message_arguments>
         </filter>
     </resource>
+    <resource path="src/org/eclipse/ocl/pivot/internal/manager/PrecedenceManager.java" type="org.eclipse.ocl.pivot.internal.manager.PrecedenceManager">
+        <filter id="336658481">
+            <message_arguments>
+                <message_argument value="org.eclipse.ocl.pivot.internal.manager.PrecedenceManager"/>
+                <message_argument value="LEAF_PRECEDENCE_ORDER"/>
+            </message_arguments>
+        </filter>
+        <filter id="336658481">
+            <message_arguments>
+                <message_argument value="org.eclipse.ocl.pivot.internal.manager.PrecedenceManager"/>
+                <message_argument value="NAVIGATION_PRECEDENCE_ORDER"/>
+            </message_arguments>
+        </filter>
+        <filter id="336658481">
+            <message_arguments>
+                <message_argument value="org.eclipse.ocl.pivot.internal.manager.PrecedenceManager"/>
+                <message_argument value="NULL_PRECEDENCE_ORDER"/>
+            </message_arguments>
+        </filter>
+    </resource>
+    <resource path="src/org/eclipse/ocl/pivot/internal/resource/ASResourceImpl.java" type="org.eclipse.ocl.pivot.internal.resource.ASResourceImpl">
+        <filter id="336658481">
+            <message_arguments>
+                <message_argument value="org.eclipse.ocl.pivot.internal.resource.ASResourceImpl"/>
+                <message_argument value="CHECK_IMMUTABILITY"/>
+            </message_arguments>
+        </filter>
+    </resource>
     <resource path="src/org/eclipse/ocl/pivot/internal/resource/StandaloneProjectMap.java" type="org.eclipse.ocl.pivot.internal.resource.StandaloneProjectMap">
         <filter comment="Bug 512402 workaround" id="576725006">
             <message_arguments>
diff --git a/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/Precedence.java b/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/Precedence.java
index 4833e71..b9d7136 100644
--- a/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/Precedence.java
+++ b/plugins/org.eclipse.ocl.pivot/emf-gen/org/eclipse/ocl/pivot/Precedence.java
@@ -29,7 +29,7 @@
  * @generated
  */
 public interface Precedence
-		extends NamedElement {
+extends NamedElement {
 
 	/**
 	 * Returns the value of the '<em><b>Associativity</b></em>' attribute.
@@ -68,22 +68,27 @@
 	 * If the meaning of the '<em>Order</em>' attribute isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
+	 * @deprecated - no longer used - use PrecedenceManager$OrderedPrecedence
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Order</em>' attribute.
 	 * @see #setOrder(Number)
 	 * @see org.eclipse.ocl.pivot.PivotPackage#getPrecedence_Order()
 	 * @generated
 	 */
+	@Deprecated
 	Number getOrder();
 
 	/**
 	 * Sets the value of the '{@link org.eclipse.ocl.pivot.Precedence#getOrder <em>Order</em>}' attribute.
 	 * <!-- begin-user-doc -->
+	 * </p>
+	 * @deprecated - no longer used - use PrecedenceManager$OrderedPrecedence
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Order</em>' attribute.
 	 * @see #getOrder()
 	 * @generated
 	 */
+	@Deprecated
 	void setOrder(Number value);
 
 } // Precedence
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PivotMetamodelManager.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PivotMetamodelManager.java
index d8522db..621518e 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PivotMetamodelManager.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PivotMetamodelManager.java
@@ -1421,8 +1421,11 @@
 		return completeClass.getPartialClasses();
 	}
 
+	/**
+	 * @since 1.5
+	 */
 	@SuppressWarnings("null")
-	protected @NonNull PrecedenceManager getPrecedenceManager() {
+	public @NonNull PrecedenceManager getPrecedenceManager() {
 		if (precedenceManager == null) {
 			standardLibrary.getOclAnyType();		// Make sure OCL Standard Library has defined operations to be compiled with precedence
 			synchronized (this) {
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PrecedenceManager.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PrecedenceManager.java
index ea49979..e4c0498 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PrecedenceManager.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/manager/PrecedenceManager.java
@@ -17,6 +17,7 @@
 
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.ocl.pivot.AssociativityKind;
 import org.eclipse.ocl.pivot.Library;
 import org.eclipse.ocl.pivot.Operation;
 import org.eclipse.ocl.pivot.Parameter;
@@ -27,20 +28,35 @@
 
 /**
  * PrecedenceManager encapsulates the knowledge about known precedences.
+ * @since 1.5
  */
 public class PrecedenceManager
 {
-
 	public static @NonNull Precedence NULL_PRECEDENCE = PivotFactory.eINSTANCE.createPrecedence();
+	/**
+	 * @since 1.5
+	 */
+	public static final int NULL_PRECEDENCE_ORDER = Integer.MAX_VALUE/2;
 	public static @NonNull Precedence NAVIGATION_PRECEDENCE = PivotFactory.eINSTANCE.createPrecedence();
+	/**
+	 * @since 1.5
+	 */
+	public static final int NAVIGATION_PRECEDENCE_ORDER = Integer.valueOf(-1);
 	public static @NonNull Precedence LEAF_PRECEDENCE = PivotFactory.eINSTANCE.createPrecedence();
+	/**
+	 * @since 1.5
+	 */
+	public static final int LEAF_PRECEDENCE_ORDER = Integer.valueOf(-2);
 	static {
 		NULL_PRECEDENCE.setName("NULL");
-		NULL_PRECEDENCE.setOrder(Integer.MAX_VALUE/2);			// Small enough to avoid wrap around during comparison
+		//		NULL_PRECEDENCE.setOrder(NULL_PRECEDENCE_ORDER);			// Small enough to avoid wrap around during comparison
+		NULL_PRECEDENCE.setAssociativity(AssociativityKind.LEFT);
 		NAVIGATION_PRECEDENCE.setName("NAVIGATION");
-		NAVIGATION_PRECEDENCE.setOrder(Integer.valueOf(-1));
+		//		NAVIGATION_PRECEDENCE.setOrder(NAVIGATION_PRECEDENCE_ORDER);
+		NAVIGATION_PRECEDENCE.setAssociativity(AssociativityKind.LEFT);
 		LEAF_PRECEDENCE.setName("LEAF");
-		LEAF_PRECEDENCE.setOrder(Integer.valueOf(-2));
+		//		LEAF_PRECEDENCE.setOrder(LEAF_PRECEDENCE_ORDER);
+		LEAF_PRECEDENCE.setAssociativity(AssociativityKind.LEFT);
 	}
 
 	/**
@@ -52,12 +68,14 @@
 	 * e.g. <tt> precedence A B D</tt> and <tt>precedence B C D</tt> merge to
 	 * <tt>A B C D</tt> with duplicate precedence objects for B and D.
 	 */
-	private Map<@NonNull String, @NonNull List<Precedence>> nameToPrecedencesMap = null;
+	private Map<@NonNull String, @NonNull List<@NonNull Precedence>> nameToPrecedencesMap = null;
 
 	private Map<@NonNull String, String> infixToPrecedenceNameMap = null;
 
 	private Map<@NonNull String, @NonNull String> prefixToPrecedenceNameMap = null;
 
+	private Map<@NonNull Precedence, @NonNull Integer> precedence2order = null;
+
 	/**
 	 * Interleave the ownedPrecedences of the rootPackages to establish a merged
 	 * ordering and assign the index in that ordering to each
@@ -70,6 +88,7 @@
 		nameToPrecedencesMap = new HashMap<>();
 		infixToPrecedenceNameMap = new HashMap<>();
 		prefixToPrecedenceNameMap = new HashMap<>();
+		precedence2order = new HashMap<>();
 		for (@NonNull Library library : libraries) {
 			List<@NonNull Precedence> precedences = ClassUtil.nullFree(library.getOwnedPrecedences());
 			if (precedences.size() > 0) {
@@ -106,12 +125,15 @@
 				}
 			}
 		}
+		precedence2order.put(NULL_PRECEDENCE, NULL_PRECEDENCE_ORDER);			// Small enough to avoid wrap around during comparison
+		precedence2order.put(NAVIGATION_PRECEDENCE, NAVIGATION_PRECEDENCE_ORDER);
+		precedence2order.put(LEAF_PRECEDENCE, LEAF_PRECEDENCE_ORDER);
 		for (int i = 0; i < orderedPrecedences.size(); i++) {
 			String name = orderedPrecedences.get(i);
-			List<Precedence> precedences = nameToPrecedencesMap.get(name);
+			List<@NonNull Precedence> precedences = nameToPrecedencesMap.get(name);
 			assert precedences != null;
 			for (Precedence precedence : precedences) {
-				precedence.setOrder(i);
+				precedence2order.put(precedence, i);
 			}
 		}
 		return errors;
@@ -171,11 +193,22 @@
 		if (precedenceName == null) {
 			return null;
 		}
-		List<Precedence> precedences = nameToPrecedencesMap.get(precedenceName);
+		List<@NonNull Precedence> precedences = nameToPrecedencesMap.get(precedenceName);
 		if (precedences == null) {
 			return null;
 		}
-		return precedences.get(0);
+		Precedence precedence = precedences.get(0);
+		if (precedence == null) {
+			return null;
+		}
+		return precedence;
+	}
+
+	/**
+	 * @since 1.5
+	 */
+	public int getOrder(@NonNull Precedence precedence) {
+		return ClassUtil.nonNullState(precedence2order.get(precedence));
 	}
 
 	public @Nullable Precedence getPrefixPrecedence(@NonNull String operatorName) {
@@ -183,10 +216,14 @@
 		if (precedenceName == null) {
 			return null;
 		}
-		List<Precedence> precedences = nameToPrecedencesMap.get(precedenceName);
+		List<@NonNull Precedence> precedences = nameToPrecedencesMap.get(precedenceName);
 		if (precedences == null) {
 			return null;
 		}
-		return precedences.get(0);
+		Precedence precedence = precedences.get(0);
+		if (precedence == null) {
+			return null;
+		}
+		return precedence;
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/prettyprint/EssentialOCLPrettyPrintVisitor.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/prettyprint/EssentialOCLPrettyPrintVisitor.java
index 6417920..05129be 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/prettyprint/EssentialOCLPrettyPrintVisitor.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/prettyprint/EssentialOCLPrettyPrintVisitor.java
@@ -55,6 +55,7 @@
 import org.eclipse.ocl.pivot.VariableExp;
 import org.eclipse.ocl.pivot.VoidType;
 import org.eclipse.ocl.pivot.ids.TypeId;
+import org.eclipse.ocl.pivot.internal.manager.PrecedenceManager;
 import org.eclipse.ocl.pivot.internal.utilities.PivotUtilInternal;
 import org.eclipse.ocl.pivot.utilities.PivotConstants;
 import org.eclipse.ocl.pivot.utilities.PivotUtil;
@@ -465,7 +466,15 @@
 			}
 			else {
 				Precedence currentPrecedence = context.getCurrentPrecedence();
-				boolean lowerPrecedence = (currentPrecedence  != null) && (precedence.getOrder().intValue() > currentPrecedence.getOrder().intValue());
+				boolean lowerPrecedence = currentPrecedence != null;
+				if (currentPrecedence != null) {
+					PrecedenceManager precedenceManager = context.getPrecedenceManager();
+					if (precedenceManager != null) {
+						int precedenceOrder = precedenceManager.getOrder(precedence);
+						int currentPrecedenceOrder = precedenceManager.getOrder(currentPrecedence);
+						lowerPrecedence = precedenceOrder > currentPrecedenceOrder;
+					}
+				}
 				if (lowerPrecedence) {
 					context.push("(", null);
 				}
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/prettyprint/PrettyPrinter.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/prettyprint/PrettyPrinter.java
index 88cc213..5d17395 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/prettyprint/PrettyPrinter.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/internal/prettyprint/PrettyPrinter.java
@@ -42,6 +42,7 @@
 import org.eclipse.ocl.pivot.TypedElement;
 import org.eclipse.ocl.pivot.ids.TypeId;
 import org.eclipse.ocl.pivot.internal.manager.PivotMetamodelManager;
+import org.eclipse.ocl.pivot.internal.manager.PrecedenceManager;
 import org.eclipse.ocl.pivot.internal.prettyprint.PrettyPrintOptions.Global;
 import org.eclipse.ocl.pivot.internal.resource.ASResourceFactory;
 import org.eclipse.ocl.pivot.internal.utilities.PathElement;
@@ -64,9 +65,9 @@
 {
 	public static final @NonNull String NULL_PLACEHOLDER = "<null>";
 	@SuppressWarnings("null")
-	public static @NonNull List<String> reservedNameList = Arrays.asList("and", "else", "endif", "false", "if", "implies", "in", "invalid", "let", "not", "null", "or", PivotConstants.SELF_NAME, "then", "true", "xor");
+	public static @NonNull List<@NonNull String> reservedNameList = Arrays.asList("and", "else", "endif", "false", "if", "implies", "in", "invalid", "let", "not", "null", "or", PivotConstants.SELF_NAME, "then", "true", "xor");
 	@SuppressWarnings("null")
-	public static @NonNull List<String> restrictedNameList = Arrays.asList(TypeId.BAG_NAME, TypeId.BOOLEAN_NAME, "Collection", TypeId.INTEGER_NAME, TypeId.OCL_ANY_NAME, TypeId.OCL_INVALID_NAME, TypeId.OCL_VOID_NAME, TypeId.ORDERED_SET_NAME, TypeId.REAL_NAME, TypeId.SEQUENCE_NAME, TypeId.SET_NAME, TypeId.STRING_NAME, TypeId.TUPLE_NAME, TypeId.UNLIMITED_NATURAL_NAME);
+	public static @NonNull List<@NonNull String> restrictedNameList = Arrays.asList(TypeId.BAG_NAME, TypeId.BOOLEAN_NAME, "Collection", TypeId.INTEGER_NAME, TypeId.OCL_ANY_NAME, TypeId.OCL_INVALID_NAME, TypeId.OCL_VOID_NAME, TypeId.ORDERED_SET_NAME, TypeId.REAL_NAME, TypeId.SEQUENCE_NAME, TypeId.SET_NAME, TypeId.STRING_NAME, TypeId.TUPLE_NAME, TypeId.UNLIMITED_NATURAL_NAME);
 
 	private static class Fragment
 	{
@@ -75,7 +76,7 @@
 		private final @NonNull String text;
 		private final @Nullable String suffix;
 		private @Nullable Fragment parent = null;
-		private List<Fragment> children = null;
+		private List<@NonNull Fragment> children = null;
 		private boolean lineWrap = true;
 		private boolean exdented = false;
 
@@ -90,7 +91,7 @@
 		public @NonNull Fragment addChild(@Nullable String prefix, @NonNull String text, @Nullable String suffix) {
 			//			assert (prefix.length() + text.length() + suffix.length()) > 0;
 			if (children == null) {
-				children = new ArrayList<Fragment>();
+				children = new ArrayList<>();
 			}
 			Fragment child = new Fragment(this, depth+1, prefix, text, suffix);
 			children.add(child);
@@ -312,6 +313,7 @@
 	private final AbstractVisitor<Object, PrettyPrinter> visitor;
 	private @Nullable Namespace scope;
 	private @Nullable Precedence currentPrecedence = null;
+	private @Nullable PrecedenceManager precedenceManager;
 
 	/**
 	 * Initializes me.
@@ -326,6 +328,15 @@
 		Resource eResource = element.eResource();
 		ASResourceFactory asResourceFactory = eResource instanceof ASResource ? ((ASResource) eResource).getASResourceFactory() : null;
 		this.visitor = asResourceFactory != null ? asResourceFactory.createPrettyPrintVisitor(this) : new PrettyPrintVisitor(this);
+		PrecedenceManager precedenceManager = null;
+		Resource asResource = element.eResource();
+		if (asResource != null) {
+			PivotMetamodelManager metamodelManager = PivotUtilInternal.findMetamodelManager(asResource);
+			if (metamodelManager != null) {
+				precedenceManager = metamodelManager.getPrecedenceManager();
+			}
+		}
+		this.precedenceManager = precedenceManager;
 	}
 
 	public void append(Number number) {
@@ -749,6 +760,13 @@
 	}
 
 	/**
+	 * @since 1.5
+	 */
+	public @Nullable PrecedenceManager getPrecedenceManager() {
+		return precedenceManager;
+	}
+
+	/**
 	 * Flush the current indented region.
 	 * Emit text indented with respect to the current indented region.
 	 * Start a new indented region.
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
index 132b7d9..e0514ee 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/PivotUtil.java
@@ -120,7 +120,10 @@
 {
 	/**
 	 * 'Highest' precedence first
+	 *
+	 * @deprecated (Not used) The Precedence.order is not a constant in a shared library. Use the PrecedenceManager.
 	 */
+	@Deprecated
 	public static class PrecedenceComparator implements Comparator<Precedence>
 	{
 		public static final PrecedenceComparator INSTANCE = new PrecedenceComparator();
diff --git a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/ToStringVisitor.java b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/ToStringVisitor.java
index 56b1076..7f1c2e4 100644
--- a/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/ToStringVisitor.java
+++ b/plugins/org.eclipse.ocl.pivot/src/org/eclipse/ocl/pivot/utilities/ToStringVisitor.java
@@ -98,6 +98,7 @@
 import org.eclipse.ocl.pivot.WildcardType;
 import org.eclipse.ocl.pivot.ids.IdManager;
 import org.eclipse.ocl.pivot.ids.TypeId;
+import org.eclipse.ocl.pivot.internal.manager.PivotMetamodelManager;
 import org.eclipse.ocl.pivot.internal.utilities.PivotUtilInternal;
 import org.eclipse.ocl.pivot.resource.ASResource;
 import org.eclipse.ocl.pivot.util.AbstractExtendingVisitor;
@@ -1067,7 +1068,13 @@
 	@Override
 	public String visitPrecedence(@NonNull Precedence precedence) {
 		appendName(precedence);
-		append("(" + precedence.getOrder() + ")");
+		Resource asResource = precedence.eResource();
+		if (asResource != null) {
+			PivotMetamodelManager metamodelManager = PivotUtilInternal.findMetamodelManager(asResource);
+			if (metamodelManager != null) {
+				append("(" + metamodelManager.getPrecedenceManager().getOrder(precedence) + ")");
+			}
+		}
 		return null;
 	}
 
diff --git a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/as2cs/AS2CSConversion.java b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/as2cs/AS2CSConversion.java
index 26a8e8b..78ec208 100644
--- a/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/as2cs/AS2CSConversion.java
+++ b/plugins/org.eclipse.ocl.xtext.base/src/org/eclipse/ocl/xtext/base/as2cs/AS2CSConversion.java
@@ -43,6 +43,7 @@
 import org.eclipse.ocl.pivot.TypedElement;
 import org.eclipse.ocl.pivot.VoidType;
 import org.eclipse.ocl.pivot.internal.manager.PivotMetamodelManager;
+import org.eclipse.ocl.pivot.internal.manager.PrecedenceManager;
 import org.eclipse.ocl.pivot.internal.utilities.AbstractConversion;
 import org.eclipse.ocl.pivot.internal.utilities.EnvironmentFactoryInternal;
 import org.eclipse.ocl.pivot.internal.utilities.PivotConstantsInternal;
@@ -281,6 +282,10 @@
 		}
 	}
 
+	public @NonNull PrecedenceManager getPrecedenceManager() {
+		return metamodelManager.getPrecedenceManager();
+	}
+
 	public @Nullable BaseReferenceVisitor getReferenceVisitor(@NonNull EClass eClass, @Nullable Namespace scope) {
 		if (scope == null) {
 			BaseReferenceVisitor referenceVisitor = referenceVisitorMap.get(eClass);
diff --git a/plugins/org.eclipse.ocl.xtext.completeocl/emf-gen/org/eclipse/ocl/xtext/completeoclcs/CompleteOCLCSPackage.java b/plugins/org.eclipse.ocl.xtext.completeocl/emf-gen/org/eclipse/ocl/xtext/completeoclcs/CompleteOCLCSPackage.java
index 7995e44..dfbb2ac 100644
--- a/plugins/org.eclipse.ocl.xtext.completeocl/emf-gen/org/eclipse/ocl/xtext/completeoclcs/CompleteOCLCSPackage.java
+++ b/plugins/org.eclipse.ocl.xtext.completeocl/emf-gen/org/eclipse/ocl/xtext/completeoclcs/CompleteOCLCSPackage.java
@@ -33,7 +33,7 @@
  * @generated
  */
 public interface CompleteOCLCSPackage
-		extends EPackage {
+extends EPackage {
 
 	/**
 	 * The package name.
@@ -1066,9 +1066,19 @@
 	 * @generated
 	 * @ordered
 	 */
+	@SuppressWarnings("deprecation")
 	int OCL_MESSAGE_ARG_CS__PRECEDENCE = EssentialOCLCSPackage.EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OCL_MESSAGE_ARG_CS__PRECEDENCE_ORDER = EssentialOCLCSPackage.EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The number of structural features of the '<em>OCL Message Arg CS</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/EssentialOCLCSPackage.java b/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/EssentialOCLCSPackage.java
index 379ac47..372ade6 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/EssentialOCLCSPackage.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/EssentialOCLCSPackage.java
@@ -33,7 +33,7 @@
  * @generated
  */
 public interface EssentialOCLCSPackage
-		extends EPackage {
+extends EPackage {
 
 	/**
 	 * The package name.
@@ -367,20 +367,31 @@
 	/**
 	 * The feature id for the '<em><b>Precedence</b></em>' reference.
 	 * <!-- begin-user-doc -->
+	 * @deprecated not used
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
+	@Deprecated
 	int EXP_CS__PRECEDENCE = BaseCSPackage.MODEL_ELEMENT_CS_FEATURE_COUNT + 6;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXP_CS__PRECEDENCE_ORDER = BaseCSPackage.MODEL_ELEMENT_CS_FEATURE_COUNT + 7;
+
+	/**
 	 * The number of structural features of the '<em>Exp CS</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int EXP_CS_FEATURE_COUNT = BaseCSPackage.MODEL_ELEMENT_CS_FEATURE_COUNT + 7;
+	int EXP_CS_FEATURE_COUNT = BaseCSPackage.MODEL_ELEMENT_CS_FEATURE_COUNT + 8;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.ocl.xtext.essentialoclcs.impl.AbstractNameExpCSImpl <em>Abstract Name Exp CS</em>}' class.
@@ -501,6 +512,15 @@
 	int ABSTRACT_NAME_EXP_CS__PRECEDENCE = EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_NAME_EXP_CS__PRECEDENCE_ORDER = EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Pre</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -691,6 +711,15 @@
 	int CALL_EXP_CS__PRECEDENCE = ABSTRACT_NAME_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CALL_EXP_CS__PRECEDENCE_ORDER = ABSTRACT_NAME_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Pre</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -899,6 +928,15 @@
 	int ASSOCIATION_CLASS_CALL_EXP_CS__PRECEDENCE = CALL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ASSOCIATION_CLASS_CALL_EXP_CS__PRECEDENCE_ORDER = CALL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Pre</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1106,6 +1144,15 @@
 	int LITERAL_EXP_CS__PRECEDENCE = EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LITERAL_EXP_CS__PRECEDENCE_ORDER = EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The number of structural features of the '<em>Literal Exp CS</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1223,6 +1270,15 @@
 	int PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE = LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE_ORDER = LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The number of structural features of the '<em>Primitive Literal Exp CS</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1340,6 +1396,15 @@
 	int BOOLEAN_LITERAL_EXP_CS__PRECEDENCE = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BOOLEAN_LITERAL_EXP_CS__PRECEDENCE_ORDER = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1466,6 +1531,15 @@
 	int COLLECTION_LITERAL_EXP_CS__PRECEDENCE = LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int COLLECTION_LITERAL_EXP_CS__PRECEDENCE_ORDER = LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Owned Parts</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2093,6 +2167,15 @@
 	int IF_EXP_CS__PRECEDENCE = EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IF_EXP_CS__PRECEDENCE_ORDER = EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Implicit</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2265,6 +2348,15 @@
 	int IF_THEN_EXP_CS__PRECEDENCE = EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IF_THEN_EXP_CS__PRECEDENCE_ORDER = EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Owned Condition</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2410,6 +2502,15 @@
 	int OPERATOR_EXP_CS__PRECEDENCE = EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OPERATOR_EXP_CS__PRECEDENCE_ORDER = EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2554,6 +2655,15 @@
 	int INFIX_EXP_CS__PRECEDENCE = OPERATOR_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INFIX_EXP_CS__PRECEDENCE_ORDER = OPERATOR_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2716,6 +2826,15 @@
 	int INVALID_LITERAL_EXP_CS__PRECEDENCE = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INVALID_LITERAL_EXP_CS__PRECEDENCE_ORDER = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The number of structural features of the '<em>Invalid Literal Exp CS</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2843,6 +2962,15 @@
 	int ITERATION_CALL_EXP_CS__PRECEDENCE = CALL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ITERATION_CALL_EXP_CS__PRECEDENCE_ORDER = CALL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Pre</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3069,6 +3197,15 @@
 	int ITERATE_CALL_EXP_CS__PRECEDENCE = ITERATION_CALL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ITERATE_CALL_EXP_CS__PRECEDENCE_ORDER = ITERATION_CALL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Pre</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3304,6 +3441,15 @@
 	int LAMBDA_LITERAL_EXP_CS__PRECEDENCE = LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LAMBDA_LITERAL_EXP_CS__PRECEDENCE_ORDER = LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Owned Expression CS</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3430,6 +3576,15 @@
 	int LET_EXP_CS__PRECEDENCE = EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LET_EXP_CS__PRECEDENCE_ORDER = EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Implicit</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3574,6 +3729,15 @@
 	int LET_VARIABLE_CS__PRECEDENCE = EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LET_VARIABLE_CS__PRECEDENCE_ORDER = EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3746,6 +3910,15 @@
 	int MAP_LITERAL_EXP_CS__PRECEDENCE = LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MAP_LITERAL_EXP_CS__PRECEDENCE_ORDER = LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Owned Parts</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4045,6 +4218,15 @@
 	int NAME_EXP_CS__PRECEDENCE = ASSOCIATION_CLASS_CALL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NAME_EXP_CS__PRECEDENCE_ORDER = ASSOCIATION_CLASS_CALL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Pre</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4441,6 +4623,15 @@
 	int NESTED_EXP_CS__PRECEDENCE = EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NESTED_EXP_CS__PRECEDENCE_ORDER = EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Owned Expression</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4567,6 +4758,15 @@
 	int NULL_LITERAL_EXP_CS__PRECEDENCE = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NULL_LITERAL_EXP_CS__PRECEDENCE_ORDER = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The number of structural features of the '<em>Null Literal Exp CS</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4684,6 +4884,15 @@
 	int NUMBER_LITERAL_EXP_CS__PRECEDENCE = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int NUMBER_LITERAL_EXP_CS__PRECEDENCE_ORDER = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Symbol</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4820,6 +5029,15 @@
 	int OPERATION_CALL_EXP_CS__PRECEDENCE = CALL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int OPERATION_CALL_EXP_CS__PRECEDENCE_ORDER = CALL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Pre</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -5037,6 +5255,15 @@
 	int PATTERN_EXP_CS__PRECEDENCE = EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PATTERN_EXP_CS__PRECEDENCE_ORDER = EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Owned Pattern Type</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -5242,6 +5469,15 @@
 	int PREFIX_EXP_CS__PRECEDENCE = OPERATOR_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PREFIX_EXP_CS__PRECEDENCE_ORDER = OPERATOR_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -5386,6 +5622,15 @@
 	int PROPERTY_CALL_EXP_CS__PRECEDENCE = CALL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PROPERTY_CALL_EXP_CS__PRECEDENCE_ORDER = CALL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Pre</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -5638,6 +5883,15 @@
 	int SELF_EXP_CS__PRECEDENCE = EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SELF_EXP_CS__PRECEDENCE_ORDER = EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -5774,6 +6028,15 @@
 	int SHADOW_EXP_CS__PRECEDENCE = ABSTRACT_NAME_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADOW_EXP_CS__PRECEDENCE_ORDER = ABSTRACT_NAME_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Pre</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -6117,6 +6380,15 @@
 	int STRING_LITERAL_EXP_CS__PRECEDENCE = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int STRING_LITERAL_EXP_CS__PRECEDENCE_ORDER = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Segments</b></em>' attribute list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -6243,6 +6515,15 @@
 	int TUPLE_LITERAL_EXP_CS__PRECEDENCE = LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TUPLE_LITERAL_EXP_CS__PRECEDENCE_ORDER = LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Owned Parts</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -6531,6 +6812,15 @@
 	int TYPE_LITERAL_EXP_CS__PRECEDENCE = LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TYPE_LITERAL_EXP_CS__PRECEDENCE_ORDER = LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Owned Path Name</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -6757,6 +7047,15 @@
 	int UNLIMITED_NATURAL_LITERAL_EXP_CS__PRECEDENCE = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int UNLIMITED_NATURAL_LITERAL_EXP_CS__PRECEDENCE_ORDER = PRIMITIVE_LITERAL_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The number of structural features of the '<em>Unlimited Natural Literal Exp CS</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -6884,6 +7183,15 @@
 	int VARIABLE_EXP_CS__PRECEDENCE = ABSTRACT_NAME_EXP_CS__PRECEDENCE;
 
 	/**
+	 * The feature id for the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_EXP_CS__PRECEDENCE_ORDER = ABSTRACT_NAME_EXP_CS__PRECEDENCE_ORDER;
+
+	/**
 	 * The feature id for the '<em><b>Is Pre</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -7278,15 +7586,28 @@
 	/**
 	 * Returns the meta object for the reference '{@link org.eclipse.ocl.xtext.essentialoclcs.ExpCS#getPrecedence <em>Precedence</em>}'.
 	 * <!-- begin-user-doc -->
+	 * @deprecated not used
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the reference '<em>Precedence</em>'.
 	 * @see org.eclipse.ocl.xtext.essentialoclcs.ExpCS#getPrecedence()
 	 * @see #getExpCS()
 	 * @generated
 	 */
+	@Deprecated
 	EReference getExpCS_Precedence();
 
 	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.ocl.xtext.essentialoclcs.ExpCS#getPrecedenceOrder <em>Precedence Order</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Precedence Order</em>'.
+	 * @see org.eclipse.ocl.xtext.essentialoclcs.ExpCS#getPrecedenceOrder()
+	 * @see #getExpCS()
+	 * @generated
+	 */
+	EAttribute getExpCS_PrecedenceOrder();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.ocl.xtext.essentialoclcs.ExpSpecificationCS <em>Exp Specification CS</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -8789,6 +9110,14 @@
 		EReference EXP_CS__PRECEDENCE = eINSTANCE.getExpCS_Precedence();
 
 		/**
+		 * The meta object literal for the '<em><b>Precedence Order</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute EXP_CS__PRECEDENCE_ORDER = eINSTANCE.getExpCS_PrecedenceOrder();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.ocl.xtext.essentialoclcs.impl.ExpSpecificationCSImpl <em>Exp Specification CS</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/ExpCS.java b/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/ExpCS.java
index 3f6df22..a00d645 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/ExpCS.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/ExpCS.java
@@ -31,6 +31,7 @@
  *   <li>{@link org.eclipse.ocl.xtext.essentialoclcs.ExpCS#getLocalRight <em>Local Right</em>}</li>
  *   <li>{@link org.eclipse.ocl.xtext.essentialoclcs.ExpCS#getLocalRightmostDescendant <em>Local Rightmost Descendant</em>}</li>
  *   <li>{@link org.eclipse.ocl.xtext.essentialoclcs.ExpCS#getPrecedence <em>Precedence</em>}</li>
+ *   <li>{@link org.eclipse.ocl.xtext.essentialoclcs.ExpCS#getPrecedenceOrder <em>Precedence Order</em>}</li>
  * </ul>
  *
  * @see org.eclipse.ocl.xtext.essentialoclcs.EssentialOCLCSPackage#getExpCS()
@@ -38,7 +39,7 @@
  * @generated
  */
 public interface ExpCS
-		extends ModelElementCS {
+extends ModelElementCS {
 
 	/**
 	 * Returns the value of the '<em><b>Local Parent</b></em>' reference.
@@ -111,7 +112,7 @@
 	 * @generated
 	 */
 	void setHasError(boolean value);
-	
+
 	/**
 	 * Returns the value of the '<em><b>Local Left</b></em>' reference.
 	 * <!-- begin-user-doc -->
@@ -151,9 +152,8 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Precedence</em>' reference.
-	 * @see #setPrecedence(Precedence)
 	 * @see org.eclipse.ocl.xtext.essentialoclcs.EssentialOCLCSPackage#getExpCS_Precedence()
-	 * @model resolveProxies="false" transient="true" volatile="true" derived="true"
+	 * @model resolveProxies="false" transient="true" changeable="false" volatile="true" derived="true"
 	 * @generated
 	 */
 	Precedence getPrecedence();
@@ -186,10 +186,31 @@
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Precedence</em>' reference.
 	 * @see #getPrecedence()
+	 * @deprecated not used - use setPrecedence(Precedence, int, AssociativityKind)
+	 */
+	@Deprecated
+	void setPrecedence(Precedence value);
+
+	/**
+	 * Returns the value of the '<em><b>Precedence Order</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Precedence Order</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Precedence Order</em>' attribute.
+	 * @see org.eclipse.ocl.xtext.essentialoclcs.EssentialOCLCSPackage#getExpCS_PrecedenceOrder()
+	 * @model transient="true" changeable="false" volatile="true" derived="true"
 	 * @generated
 	 */
-	void setPrecedence(Precedence value);
-	
+	int getPrecedenceOrder();
+
 	@Nullable OperatorExpCS getLocalLeftContainer();
 	@Nullable OperatorExpCS getLocalRightContainer();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.ocl.xtext.essentialoclcs.ExpCS#getPrecedence <em>Precedence</em>}' reference.
+	 */
+	void setPrecedence(@Nullable Precedence precedence, int precedenceOrder);
 } // ExpCS
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/EssentialOCLCSPackageImpl.java b/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/EssentialOCLCSPackageImpl.java
index 737948b..8650b94 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/EssentialOCLCSPackageImpl.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/EssentialOCLCSPackageImpl.java
@@ -815,6 +815,17 @@
 	 * @generated
 	 */
 	@Override
+	public EAttribute getExpCS_PrecedenceOrder()
+	{
+		return (EAttribute)expCSEClass.getEStructuralFeatures().get(7);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getExpSpecificationCS() {
 		return expSpecificationCSEClass;
 	}
@@ -2073,6 +2084,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("deprecation")
 	public void createPackageContents() {
 		if (isCreated) return;
 		isCreated = true;
@@ -2132,6 +2144,7 @@
 		createEReference(expCSEClass, EXP_CS__LOCAL_RIGHT);
 		createEReference(expCSEClass, EXP_CS__LOCAL_RIGHTMOST_DESCENDANT);
 		createEReference(expCSEClass, EXP_CS__PRECEDENCE);
+		createEAttribute(expCSEClass, EXP_CS__PRECEDENCE_ORDER);
 
 		expSpecificationCSEClass = createEClass(EXP_SPECIFICATION_CS);
 		createEReference(expSpecificationCSEClass, EXP_SPECIFICATION_CS__OWNED_EXPRESSION);
@@ -2420,7 +2433,8 @@
 		initEReference(getExpCS_LocalParent(), this.getOperatorExpCS(), null, "localParent", null, 0, 1, ExpCS.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 		initEReference(getExpCS_LocalRight(), this.getExpCS(), null, "localRight", null, 0, 1, ExpCS.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 		initEReference(getExpCS_LocalRightmostDescendant(), this.getExpCS(), null, "localRightmostDescendant", null, 1, 1, ExpCS.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
-		initEReference(getExpCS_Precedence(), thePivotPackage.getPrecedence(), null, "precedence", null, 0, 1, ExpCS.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getExpCS_Precedence(), thePivotPackage.getPrecedence(), null, "precedence", null, 0, 1, ExpCS.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getExpCS_PrecedenceOrder(), ecorePackage.getEInt(), "precedenceOrder", null, 0, 1, ExpCS.class, IS_TRANSIENT, IS_VOLATILE, !IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 
 		EOperation op = addEOperation(expCSEClass, ecorePackage.getEBoolean(), "isLocalLeftAncestorOf", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
 		addEParameter(op, this.getExpCS(), "csExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/ExpCSImpl.java b/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/ExpCSImpl.java
index d305f9e..4405fcf 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/ExpCSImpl.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/ExpCSImpl.java
@@ -43,13 +43,14 @@
  *   <li>{@link org.eclipse.ocl.xtext.essentialoclcs.impl.ExpCSImpl#getLocalRight <em>Local Right</em>}</li>
  *   <li>{@link org.eclipse.ocl.xtext.essentialoclcs.impl.ExpCSImpl#getLocalRightmostDescendant <em>Local Rightmost Descendant</em>}</li>
  *   <li>{@link org.eclipse.ocl.xtext.essentialoclcs.impl.ExpCSImpl#getPrecedence <em>Precedence</em>}</li>
+ *   <li>{@link org.eclipse.ocl.xtext.essentialoclcs.impl.ExpCSImpl#getPrecedenceOrder <em>Precedence Order</em>}</li>
  * </ul>
  *
  * @generated
  */
 public class ExpCSImpl
-		extends ModelElementCSImpl
-		implements ExpCS {
+extends ModelElementCSImpl
+implements ExpCS {
 
 	/**
 	 * The default value of the '{@link #isHasError() <em>Has Error</em>}' attribute.
@@ -71,6 +72,16 @@
 	protected boolean hasError = HAS_ERROR_EDEFAULT;
 
 	/**
+	 * The default value of the '{@link #getPrecedenceOrder() <em>Precedence Order</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getPrecedenceOrder()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int PRECEDENCE_ORDER_EDEFAULT = 0;
+
+	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -119,6 +130,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@SuppressWarnings("deprecation")
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID)
@@ -137,6 +149,8 @@
 				return getLocalRightmostDescendant();
 			case EssentialOCLCSPackage.EXP_CS__PRECEDENCE:
 				return getPrecedence();
+			case EssentialOCLCSPackage.EXP_CS__PRECEDENCE_ORDER:
+				return getPrecedenceOrder();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -153,9 +167,6 @@
 			case EssentialOCLCSPackage.EXP_CS__HAS_ERROR:
 				setHasError((Boolean)newValue);
 				return;
-			case EssentialOCLCSPackage.EXP_CS__PRECEDENCE:
-				setPrecedence((Precedence)newValue);
-				return;
 		}
 		super.eSet(featureID, newValue);
 	}
@@ -172,9 +183,6 @@
 			case EssentialOCLCSPackage.EXP_CS__HAS_ERROR:
 				setHasError(HAS_ERROR_EDEFAULT);
 				return;
-			case EssentialOCLCSPackage.EXP_CS__PRECEDENCE:
-				setPrecedence((Precedence)null);
-				return;
 		}
 		super.eUnset(featureID);
 	}
@@ -184,7 +192,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	@SuppressWarnings("null")
+	@SuppressWarnings({"null", "deprecation"})
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID)
@@ -203,6 +211,8 @@
 				return getLocalRightmostDescendant() != null;
 			case EssentialOCLCSPackage.EXP_CS__PRECEDENCE:
 				return getPrecedence() != null;
+			case EssentialOCLCSPackage.EXP_CS__PRECEDENCE_ORDER:
+				return getPrecedenceOrder() != PRECEDENCE_ORDER_EDEFAULT;
 		}
 		return super.eIsSet(featureID);
 	}
@@ -311,7 +321,7 @@
 			return csNearestLeft;
 		}
 	}
-	
+
 	private @Nullable OperatorExpCS getLocalParentForRight(@Nullable ExpCS csRight) {
 		if (csRight == null) {
 			return null;
@@ -336,7 +346,7 @@
 			return csNearestRight;
 		}
 	}
-	
+
 	private @Nullable ExpCS localRight = null;
 	private boolean hasLocalRight = false;
 
@@ -385,6 +395,11 @@
 	}
 
 	@Override
+	public int getPrecedenceOrder() {
+		return PrecedenceManager.LEAF_PRECEDENCE_ORDER;
+	}
+
+	@Override
 	public boolean isLocalLeftAncestorOf(@NonNull ExpCS csExp) {	// csExp should be to the right of this for associativity resolution
 		return false;
 	}
@@ -407,10 +422,15 @@
 	}
 
 	@Override
-	public void setPrecedence(Precedence newPrecedence) {
+	public final void setPrecedence(Precedence newPrecedence) {
 		throw new UnsupportedOperationException(); // Only OperatorExpCS is settable
 	}
-	
+
+	@Override
+	public void setPrecedence(@Nullable Precedence precedence, int precedenceOrder) {
+		throw new UnsupportedOperationException(); // Only OperatorExpCS is settable
+	}
+
 	/**
 	 * @generated NOT
 	 */
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/OperatorExpCSImpl.java b/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/OperatorExpCSImpl.java
index fdeca68..59a09fb 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/OperatorExpCSImpl.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/emf-gen/org/eclipse/ocl/xtext/essentialoclcs/impl/OperatorExpCSImpl.java
@@ -44,8 +44,8 @@
  * @generated
  */
 public abstract class OperatorExpCSImpl
-		extends ExpCSImpl
-		implements OperatorExpCS {
+extends ExpCSImpl
+implements OperatorExpCS {
 
 	/**
 	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
@@ -308,7 +308,10 @@
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
-	
+
+	private Precedence precedence = null;
+	private int precedenceOrder = 0;
+
 	protected @Nullable ExpCS getExpressionForLeft(@NonNull ExpCS csLeft) {
 		if (csLeft instanceof OperatorExpCS) {
 			OperatorExpCS csLeftOperator = (OperatorExpCS) csLeft;
@@ -333,7 +336,7 @@
 		}
 		return getExpressionForLefts(csLeft.getLocalLeft(), csLowestLeft);
 	}
-	
+
 	protected @Nullable ExpCS getExpressionForRight(@NonNull ExpCS csRight) {
 		if (csRight instanceof OperatorExpCS) {
 			OperatorExpCS csRightOperator = (OperatorExpCS) csRight;
@@ -359,6 +362,18 @@
 		return getExpressionForRights(csRight.getLocalRight(), csLowestRight);
 	}
 
+	@Override
+	public @Nullable ExpCS getLocalRight() {
+		ExpCS ownedRight = getOwnedRight();
+		return ownedRight != null ? ownedRight.getLocalLeftmostDescendant() : null;
+	}
+
+	@Override
+	public @NonNull ExpCS getLocalRightmostDescendant() {
+		ExpCS ownedRight = getOwnedRight();
+		return ownedRight != null ? ownedRight.getLocalRightmostDescendant() : this;
+	}
+
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -378,23 +393,14 @@
 		return eContainer instanceof ElementCS ? (ElementCS) eContainer : null;		// Avoid CCE for Bug 432749
 	}
 
-	private Precedence precedence = null;
-	
 	@Override
-	public Precedence getPrecedence() {
+	public @NonNull Precedence getPrecedence() {
 		return precedence != null ? precedence : PrecedenceManager.NULL_PRECEDENCE;
 	}
 
 	@Override
-	public @Nullable ExpCS getLocalRight() {
-		ExpCS ownedRight = getOwnedRight();
-		return ownedRight != null ? ownedRight.getLocalLeftmostDescendant() : null;
-	}
-
-	@Override
-	public @NonNull ExpCS getLocalRightmostDescendant() {
-		ExpCS ownedRight = getOwnedRight();
-		return ownedRight != null ? ownedRight.getLocalRightmostDescendant() : this;
+	public int getPrecedenceOrder() {
+		return precedenceOrder;
 	}
 
 	@Override
@@ -402,17 +408,15 @@
 
 	@Override
 	public boolean isLocalLeftAncestorOf(@NonNull ExpCS csExp) {	// csExp should be to the right of this for associativity resolution
-		Precedence leftPrecedence = getPrecedence();
-		Precedence rightPrecedence = csExp.getPrecedence();
-		int leftOrder = leftPrecedence.getOrder().intValue();
-		int rightOrder = rightPrecedence.getOrder().intValue();
+		int leftOrder = getPrecedenceOrder();
+		int rightOrder = csExp.getPrecedenceOrder();
 		if (leftOrder > rightOrder) {
 			return true;
 		}
 		else if (leftOrder > rightOrder) {
 			return false;
 		}
-		else if (leftPrecedence.getAssociativity() == AssociativityKind.RIGHT) {
+		else if (getPrecedence().getAssociativity() == AssociativityKind.RIGHT) {
 			return true;
 		}
 		else {
@@ -438,8 +442,9 @@
 	}
 
 	@Override
-	public void setPrecedence(Precedence newPrecedence) {
+	public void setPrecedence(@Nullable Precedence newPrecedence, int newPrecedenceOrder) {
 		precedence = newPrecedence;
+		precedenceOrder = newPrecedenceOrder;
 	}
 
 	/**
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/model/EssentialOCLCS.genmodel b/plugins/org.eclipse.ocl.xtext.essentialocl/model/EssentialOCLCS.genmodel
index e8ac33a..4a9d937 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/model/EssentialOCLCS.genmodel
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/model/EssentialOCLCS.genmodel
@@ -78,6 +78,7 @@
       <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference EssentialOCLCS.ecore#//ExpCS/localRight"/>
       <genFeatures property="Readonly" notify="false" createChild="false" ecoreFeature="ecore:EReference EssentialOCLCS.ecore#//ExpCS/localRightmostDescendant"/>
       <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference EssentialOCLCS.ecore#//ExpCS/precedence"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute EssentialOCLCS.ecore#//ExpCS/precedenceOrder"/>
       <genOperations ecoreOperation="EssentialOCLCS.ecore#//ExpCS/isLocalLeftAncestorOf">
         <genParameters ecoreParameter="EssentialOCLCS.ecore#//ExpCS/isLocalLeftAncestorOf/csExp"/>
       </genOperations>
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/as2cs/EssentialOCLDeclarationVisitor.java b/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/as2cs/EssentialOCLDeclarationVisitor.java
index 19ad3f2..4ae4bed 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/as2cs/EssentialOCLDeclarationVisitor.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/as2cs/EssentialOCLDeclarationVisitor.java
@@ -65,6 +65,7 @@
 import org.eclipse.ocl.pivot.ids.TupleTypeId;
 import org.eclipse.ocl.pivot.ids.TypeId;
 import org.eclipse.ocl.pivot.internal.complete.CompleteClassInternal;
+import org.eclipse.ocl.pivot.internal.manager.PrecedenceManager;
 import org.eclipse.ocl.pivot.internal.prettyprint.PrettyPrinter;
 import org.eclipse.ocl.pivot.utilities.NameUtil;
 import org.eclipse.ocl.pivot.utilities.PivotConstants;
@@ -276,7 +277,8 @@
 		if (asThisPrecedence == null) {
 			return false;
 		}
-		return asThisPrecedence.getOrder().intValue() > asThatPrecedence.getOrder().intValue();
+		PrecedenceManager precedenceManager = context.getPrecedenceManager();
+		return precedenceManager.getOrder(asThisPrecedence) > precedenceManager.getOrder(asThatPrecedence);
 	}
 
 	protected ElementCS refreshConstraint(@NonNull ConstraintCS csElement, @NonNull Constraint object) {
diff --git a/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSPreOrderVisitor.java b/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSPreOrderVisitor.java
index 0a19155..6555dbb 100644
--- a/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSPreOrderVisitor.java
+++ b/plugins/org.eclipse.ocl.xtext.essentialocl/src/org/eclipse/ocl/xtext/essentialocl/cs2as/EssentialOCLCSPreOrderVisitor.java
@@ -104,8 +104,14 @@
 		public BasicContinuation<?> execute() {
 			PivotMetamodelManager metamodelManager = context.getMetamodelManager();
 			String operatorName = csElement.getName();
-			Precedence precedence = operatorName != null ? metamodelManager.getInfixPrecedence(operatorName) : null;
-			csElement.setPrecedence(precedence);
+			Precedence precedence = operatorName != null ? metamodelManager.getPrecedenceManager().getInfixPrecedence(operatorName) : null;
+			//			csElement.setPrecedence(precedence);
+			if (precedence != null) {
+				csElement.setPrecedence(precedence, metamodelManager.getPrecedenceManager().getOrder(precedence));
+			}
+			else {
+				csElement.setPrecedence(null, PrecedenceManager.NULL_PRECEDENCE_ORDER);
+			}
 			return super.execute();
 		}
 	}
@@ -157,8 +163,14 @@
 		public BasicContinuation<?> execute() {
 			PivotMetamodelManager metamodelManager = context.getMetamodelManager();
 			String operatorName = csElement.getName();
-			Precedence precedence = operatorName != null ? metamodelManager.getPrefixPrecedence(operatorName) : null;
-			csElement.setPrecedence(precedence);
+			Precedence precedence = operatorName != null ? metamodelManager.getPrecedenceManager().getPrefixPrecedence(operatorName) : null;
+			//			csElement.setPrecedence(precedence);
+			if (precedence != null) {
+				csElement.setPrecedence(precedence, metamodelManager.getPrecedenceManager().getOrder(precedence));
+			}
+			else {
+				csElement.setPrecedence(null, PrecedenceManager.NULL_PRECEDENCE_ORDER);
+			}
 			return super.execute();
 		}
 	}
@@ -229,7 +241,7 @@
 	@Override
 	public Continuation<?> visitInfixExpCS(@NonNull InfixExpCS csElement) {
 		if (NavigationUtil.isNavigationInfixExp(csElement)) {
-			csElement.setPrecedence(PrecedenceManager.NAVIGATION_PRECEDENCE);
+			csElement.setPrecedence(PrecedenceManager.NAVIGATION_PRECEDENCE, PrecedenceManager.NAVIGATION_PRECEDENCE_ORDER);
 			return null;
 		}
 		else {
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/PrecedenceTests.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/PrecedenceTests.java
index 2003df5..0979d11 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/PrecedenceTests.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/PrecedenceTests.java
@@ -27,7 +27,7 @@
  */
 public class PrecedenceTests extends XtextTestCase
 {
-	protected Precedence createPrecedence(Library library1, String name, AssociativityKind associativity) {
+	protected @NonNull Precedence createPrecedence(Library library1, String name, AssociativityKind associativity) {
 		Precedence precedence = PivotFactory.eINSTANCE.createPrecedence();
 		precedence.setName(name);
 		precedence.setAssociativity(associativity);
@@ -47,13 +47,14 @@
 		Precedence p2b = createPrecedence(library2, "C", AssociativityKind.LEFT);
 		Precedence p2c = createPrecedence(library2, "D", AssociativityKind.LEFT);
 		libraries.add(library2);
-		List<String> errors = new PrecedenceManager().compilePrecedences(libraries);
-		assertEquals(0, p1a.getOrder());
-		assertEquals(1, p1b.getOrder());
-		assertEquals(3, p1c.getOrder());
-		assertEquals(1, p2a.getOrder());
-		assertEquals(2, p2b.getOrder());
-		assertEquals(3, p2c.getOrder());
+		PrecedenceManager precedenceManager = new PrecedenceManager();
+		List<String> errors = precedenceManager.compilePrecedences(libraries);
+		assertEquals(0, precedenceManager.getOrder(p1a));
+		assertEquals(1, precedenceManager.getOrder(p1b));
+		assertEquals(3, precedenceManager.getOrder(p1c));
+		assertEquals(1, precedenceManager.getOrder(p2a));
+		assertEquals(2, precedenceManager.getOrder(p2b));
+		assertEquals(3, precedenceManager.getOrder(p2c));
 		assertEquals(0, errors.size());
 	}
 
@@ -67,11 +68,12 @@
 		Precedence p2a = createPrecedence(library2, "B", AssociativityKind.LEFT);
 		Precedence p2b = createPrecedence(library2, "A", AssociativityKind.LEFT);
 		libraries.add(library2);
-		List<String> errors = new PrecedenceManager().compilePrecedences(libraries);
-		assertEquals(0, p1a.getOrder());
-		assertEquals(1, p1b.getOrder());
-		assertEquals(1, p2a.getOrder());
-		assertEquals(0, p2b.getOrder());
+		PrecedenceManager precedenceManager = new PrecedenceManager();
+		List<String> errors = precedenceManager.compilePrecedences(libraries);
+		assertEquals(0, precedenceManager.getOrder(p1a));
+		assertEquals(1, precedenceManager.getOrder(p1b));
+		assertEquals(1, precedenceManager.getOrder(p2a));
+		assertEquals(0, precedenceManager.getOrder(p2b));
 		assertEquals(1, errors.size());
 	}
 
@@ -83,9 +85,10 @@
 		Library library2 = PivotFactory.eINSTANCE.createLibrary();
 		Precedence p2a = createPrecedence(library2, "A", AssociativityKind.RIGHT);
 		libraries.add(library2);
-		List<String> errors = new PrecedenceManager().compilePrecedences(libraries);
-		assertEquals(0, p1a.getOrder());
-		assertEquals(0, p2a.getOrder());
+		PrecedenceManager precedenceManager = new PrecedenceManager();
+		List<String> errors = precedenceManager.compilePrecedences(libraries);
+		assertEquals(0, precedenceManager.getOrder(p1a));
+		assertEquals(0, precedenceManager.getOrder(p2a));
 		assertEquals(1, errors.size());
 	}
 
@@ -101,13 +104,14 @@
 		Precedence p2b = createPrecedence(library2, "C", AssociativityKind.LEFT);
 		Precedence p2c = createPrecedence(library2, "D", AssociativityKind.LEFT);
 		libraries.add(library2);
-		List<String> errors = new PrecedenceManager().compilePrecedences(libraries);
-		assertEquals(0, p1a.getOrder());
-		assertEquals(2, p1b.getOrder());
-		assertEquals(3, p1c.getOrder());
-		assertEquals(0, p2a.getOrder());
-		assertEquals(1, p2b.getOrder());
-		assertEquals(3, p2c.getOrder());
+		PrecedenceManager precedenceManager = new PrecedenceManager();
+		List<String> errors = precedenceManager.compilePrecedences(libraries);
+		assertEquals(0, precedenceManager.getOrder(p1a));
+		assertEquals(2, precedenceManager.getOrder(p1b));
+		assertEquals(3, precedenceManager.getOrder(p1c));
+		assertEquals(0, precedenceManager.getOrder(p2a));
+		assertEquals(1, precedenceManager.getOrder(p2b));
+		assertEquals(3, precedenceManager.getOrder(p2c));
 		assertEquals(1, errors.size());
 	}
 
@@ -121,11 +125,12 @@
 		Precedence p2a = createPrecedence(library2, "A", AssociativityKind.LEFT);
 		Precedence p2b = createPrecedence(library2, "C", AssociativityKind.LEFT);
 		libraries.add(library2);
-		List<String> errors = new PrecedenceManager().compilePrecedences(libraries);
-		assertEquals(0, p1a.getOrder());
-		assertEquals(2, p1b.getOrder());
-		assertEquals(0, p2a.getOrder());
-		assertEquals(1, p2b.getOrder());
+		PrecedenceManager precedenceManager = new PrecedenceManager();
+		List<String> errors = precedenceManager.compilePrecedences(libraries);
+		assertEquals(0, precedenceManager.getOrder(p1a));
+		assertEquals(2, precedenceManager.getOrder(p1b));
+		assertEquals(0, precedenceManager.getOrder(p2a));
+		assertEquals(1, precedenceManager.getOrder(p2b));
 		assertEquals(1, errors.size());
 	}
 }