Added some validations for (local) mode labels
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/model-gen/xml/amalthea.xml b/plugins/org.eclipse.app4mc.amalthea.model/model-gen/xml/amalthea.xml
index e56b838..3c26639 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/model-gen/xml/amalthea.xml
+++ b/plugins/org.eclipse.app4mc.amalthea.model/model-gen/xml/amalthea.xml
@@ -2998,6 +2998,18 @@
       </eAnnotations>
       <eParameters name="context" unique="false" upperBound="-1" eType="#//ModeValueMapEntry"/>
     </eOperations>
+    <eOperations name="validateInvariants" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return &lt;%org.eclipse.app4mc.amalthea.model.AmaltheaValidations%>.validateInvariants(this, diagnostics);"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
+      <eParameters name="context" unique="false">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="label1" lowerBound="1"
         eType="#//ModeLabel"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="label2" lowerBound="1"
@@ -4302,6 +4314,28 @@
         <details key="body" value="&lt;%org.eclipse.emf.common.util.EList%>&lt;&lt;%java.lang.String%>> _xblockexpression = null;&#xA;{&#xA;&#x9;final &lt;%org.eclipse.app4mc.amalthea.model.IExecutable%> exe = this.getContainingExecutable();&#xA;&#x9;&lt;%org.eclipse.emf.common.util.EList%>&lt;&lt;%java.lang.String%>> _xifexpression = null;&#xA;&#x9;if ((exe instanceof &lt;%org.eclipse.app4mc.amalthea.model.INamed%>))&#xA;&#x9;{&#xA;&#x9;&#x9;_xifexpression = ((&lt;%org.eclipse.app4mc.amalthea.model.INamed%>)exe).getQualifiedNameSegments();&#xA;&#x9;}&#xA;&#x9;else&#xA;&#x9;{&#xA;&#x9;&#x9;_xifexpression = &lt;%org.eclipse.emf.ecore.xcore.lib.XcoreCollectionLiterals%>.&lt;&lt;%java.lang.String%>>newBasicEList();&#xA;&#x9;}&#xA;&#x9;_xblockexpression = _xifexpression;&#xA;}&#xA;return _xblockexpression;"/>
       </eAnnotations>
     </eOperations>
+    <eOperations name="validateInvariants" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return &lt;%org.eclipse.app4mc.amalthea.model.AmaltheaValidations%>.validateInvariants(this, diagnostics);"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
+      <eParameters name="context" unique="false">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
+    <eOperations name="isEnum" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="&lt;%org.eclipse.app4mc.amalthea.model.Mode%> _mode = this.getMode();&#xA;return (_mode instanceof &lt;%org.eclipse.app4mc.amalthea.model.EnumMode%>);"/>
+      </eAnnotations>
+    </eOperations>
+    <eOperations name="isNumeric" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="&lt;%org.eclipse.app4mc.amalthea.model.Mode%> _mode = this.getMode();&#xA;return (_mode instanceof &lt;%org.eclipse.app4mc.amalthea.model.NumericMode%>);"/>
+      </eAnnotations>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="containingExecutable" eType="#//IExecutable"
         changeable="false" eOpposite="#//IExecutable/localLabels">
       <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
@@ -4313,6 +4347,18 @@
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="LocalModeValue" abstract="true">
+    <eOperations name="validateInvariants" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return &lt;%org.eclipse.app4mc.amalthea.model.AmaltheaValidations%>.validateInvariants(this, diagnostics);"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
+      <eParameters name="context" unique="false">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="label" lowerBound="1" eType="#//LocalModeLabel"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="valueSource" lowerBound="1"
         eType="#//ILocalModeValueSource" containment="true" resolveProxies="false"/>
@@ -4323,24 +4369,95 @@
         eType="#//RelationalOperator"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ILocalModeValueSource" abstract="true"
-      interface="true"/>
+      interface="true">
+    <eOperations name="isEnum" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return false;"/>
+      </eAnnotations>
+    </eOperations>
+    <eOperations name="isNumeric" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return false;"/>
+      </eAnnotations>
+    </eOperations>
+    <eOperations name="getMode" unique="false" eType="#//Mode">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return null;"/>
+      </eAnnotations>
+    </eOperations>
+  </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ModeLiteralConst" eSuperTypes="#//ILocalModeValueSource">
+    <eOperations name="isEnum" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return true;"/>
+      </eAnnotations>
+    </eOperations>
+    <eOperations name="getMode" unique="false" eType="#//Mode">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="&lt;%org.eclipse.app4mc.amalthea.model.ModeLiteral%> _value = this.getValue();&#xA;&lt;%org.eclipse.app4mc.amalthea.model.EnumMode%> _containingMode = null;&#xA;if (_value!=null)&#xA;{&#xA;&#x9;_containingMode=_value.getContainingMode();&#xA;}&#xA;return _containingMode;"/>
+      </eAnnotations>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" eType="#//ModeLiteral"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="IntegerConst" eSuperTypes="#//ILocalModeValueSource">
+    <eOperations name="isNumeric" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return true;"/>
+      </eAnnotations>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" unique="false" lowerBound="1"
         eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt" defaultValueLiteral="0"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ModeLabelRef" eSuperTypes="#//ILocalModeValueSource">
+    <eOperations name="isEnum" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return this.getValue().isEnum();"/>
+      </eAnnotations>
+    </eOperations>
+    <eOperations name="isNumeric" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return this.getValue().isNumeric();"/>
+      </eAnnotations>
+    </eOperations>
+    <eOperations name="getMode" unique="false" eType="#//Mode">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="&lt;%org.eclipse.app4mc.amalthea.model.ModeLabel%> _value = this.getValue();&#xA;&lt;%org.eclipse.app4mc.amalthea.model.Mode%> _mode = null;&#xA;if (_value!=null)&#xA;{&#xA;&#x9;_mode=_value.getMode();&#xA;}&#xA;return _mode;"/>
+      </eAnnotations>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" eType="#//ModeLabel"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="LocalModeLabelRef" eSuperTypes="#//ILocalModeValueSource">
+    <eOperations name="isEnum" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return this.getValue().isEnum();"/>
+      </eAnnotations>
+    </eOperations>
+    <eOperations name="isNumeric" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return this.getValue().isNumeric();"/>
+      </eAnnotations>
+    </eOperations>
+    <eOperations name="getMode" unique="false" eType="#//Mode">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="&lt;%org.eclipse.app4mc.amalthea.model.LocalModeLabel%> _value = this.getValue();&#xA;&lt;%org.eclipse.app4mc.amalthea.model.Mode%> _mode = null;&#xA;if (_value!=null)&#xA;{&#xA;&#x9;_mode=_value.getMode();&#xA;}&#xA;return _mode;"/>
+      </eAnnotations>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" eType="#//LocalModeLabel"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ChannelFillRef" eSuperTypes="#//ILocalModeValueSource">
+    <eOperations name="isNumeric" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return true;"/>
+      </eAnnotations>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="value" lowerBound="1" eType="#//Channel"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ArithmeticExpression" eSuperTypes="#//ILocalModeValueSource">
+    <eOperations name="isNumeric" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return true;"/>
+      </eAnnotations>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="operand1" eType="#//ILocalModeValueSource"
         containment="true" resolveProxies="false"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="operand2" eType="#//ILocalModeValueSource"
@@ -4356,6 +4473,18 @@
     <eLiterals name="MODULO"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ModeLabelAssignment" eSuperTypes="#//ActivityGraphItem">
+    <eOperations name="validateInvariants" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="body" value="return &lt;%org.eclipse.app4mc.amalthea.model.AmaltheaValidations%>.validateInvariants(this, diagnostics);"/>
+      </eAnnotations>
+      <eParameters name="diagnostics" unique="false" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDiagnosticChain"/>
+      <eParameters name="context" unique="false">
+        <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EMap">
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+          <eTypeArguments eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+        </eGenericType>
+      </eParameters>
+    </eOperations>
     <eStructuralFeatures xsi:type="ecore:EReference" name="globalLabel" lowerBound="1"
         eType="#//ModeLabel"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="localLabel" lowerBound="1"
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/model/amalthea.xcore b/plugins/org.eclipse.app4mc.amalthea.model/model/amalthea.xcore
index 996987a..184f539 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/model/amalthea.xcore
+++ b/plugins/org.eclipse.app4mc.amalthea.model/model/amalthea.xcore
@@ -2999,6 +2999,10 @@
 		val labelValue2 = context?.get(label2)
 		return (labelValue1 === null) || (labelValue2 === null) || (labelValue1 == labelValue2)
 	}
+
+	op boolean validateInvariants(EDiagnosticChain diagnostics, EMap<Object,Object> context) {
+		AmaltheaValidations.validateInvariants(this, diagnostics)
+	}
 }
 
 
@@ -3796,13 +3800,8 @@
 		AmaltheaValidations.validateInvariants(this, diagnostics)
 	}
 
-	op boolean isEnum() {
-		mode instanceof EnumMode
-	}
-	
-	op boolean isNumeric() {
-		mode instanceof NumericMode
-	}
+	op boolean isEnum() {mode instanceof EnumMode}
+	op boolean isNumeric() {mode instanceof NumericMode}
 }
 
 
@@ -4354,11 +4353,22 @@
 		val exe = containingExecutable
 		if (exe instanceof INamed) exe.qualifiedNameSegments else newBasicEList
 	}
+
+	op boolean validateInvariants(EDiagnosticChain diagnostics, EMap<Object,Object> context) {
+		AmaltheaValidations.validateInvariants(this, diagnostics)
+	}
+
+	op boolean isEnum() {mode instanceof EnumMode}
+	op boolean isNumeric() {mode instanceof NumericMode}
 }
 
 abstract class LocalModeValue {
 	refers LocalModeLabel[1] label
 	contains ILocalModeValueSource[1] valueSource
+
+	op boolean validateInvariants(EDiagnosticChain diagnostics, EMap<Object,Object> context) {
+		AmaltheaValidations.validateInvariants(this, diagnostics)
+	}
 }
 
 class LocalModeLabelAssignment extends LocalModeValue, ActivityGraphItem {
@@ -4368,32 +4378,53 @@
 	RelationalOperator relation
 }
 
-interface ILocalModeValueSource {}
+interface ILocalModeValueSource {
+	op boolean isEnum() {false}
+	op boolean isNumeric() {false}
+	op Mode getMode() {null}
+}
 
 class ModeLiteralConst extends ILocalModeValueSource {
 	refers ModeLiteral[1] value
+
+	op boolean isEnum() {true}
+	op Mode getMode() {value?.containingMode}
 }
 
 class IntegerConst extends ILocalModeValueSource {
 	int[1] value = "0"
+
+	op boolean isNumeric() {true}
 }
 
 class ModeLabelRef extends ILocalModeValueSource {
 	refers ModeLabel[1] value
+
+	op boolean isEnum() {value.isEnum}
+	op boolean isNumeric() {value.isNumeric}
+	op Mode getMode() {value?.mode}
 }
 
 class LocalModeLabelRef extends ILocalModeValueSource {
 	refers LocalModeLabel[1] value
+
+	op boolean isEnum() {value.isEnum}
+	op boolean isNumeric() {value.isNumeric}
+	op Mode getMode() {value?.mode}
 }
 
 class ChannelFillRef extends ILocalModeValueSource {
 	refers Channel[1] value
+
+	op boolean isNumeric() {true}
 }
 
 class ArithmeticExpression extends ILocalModeValueSource {
 	contains ILocalModeValueSource operand1
 	contains ILocalModeValueSource operand2
 	ArithmeticOperator operator
+
+	op boolean isNumeric() {true}
 }
 
 enum ArithmeticOperator
@@ -4408,4 +4439,8 @@
 class ModeLabelAssignment extends ActivityGraphItem {
 	refers ModeLabel[1] globalLabel
 	refers LocalModeLabel[1] localLabel
+
+	op boolean validateInvariants(EDiagnosticChain diagnostics, EMap<Object,Object> context) {
+		AmaltheaValidations.validateInvariants(this, diagnostics)
+	}
 }
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/src/org/eclipse/app4mc/amalthea/model/AmaltheaValidations.java b/plugins/org.eclipse.app4mc.amalthea.model/src/org/eclipse/app4mc/amalthea/model/AmaltheaValidations.java
index 8ffb49e..f60971a 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/src/org/eclipse/app4mc/amalthea/model/AmaltheaValidations.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/src/org/eclipse/app4mc/amalthea/model/AmaltheaValidations.java
@@ -143,7 +143,27 @@
 		return isValid;
 	}
 
-	// ******** Modes ********
+	// ******** Modes and Local Modes ********
+
+	public static boolean validateInvariants(LocalModeLabel obj, DiagnosticChain diagnostics) {
+		return checkModeAndValue(obj, PACKAGE.getLocalModeLabel_DefaultValue(), obj.getMode(), obj.getDefaultValue(), diagnostics);
+	}
+
+	public static boolean validateInvariants(LocalModeValue obj, DiagnosticChain diagnostics) {
+		if  (obj.getLabel() != null && obj.getValueSource() != null) {
+			LocalModeLabel label = obj.getLabel();
+			ILocalModeValueSource source = obj.getValueSource();
+
+			if ((label.isEnum() && source.isNumeric()) || (label.isNumeric() && source.isEnum())) {
+				addError(obj, PACKAGE.getLocalModeValue_ValueSource(), obj.eClass().getName() + ": incompatible types", diagnostics);
+				return false;
+			}
+
+			return checkModeCompatibility(obj, PACKAGE.getLocalModeValue_ValueSource(), label.getMode(), source.getMode(), diagnostics);
+		}
+
+		return true;
+	}
 
 	public static boolean validateInvariants(ModeLabel obj, DiagnosticChain diagnostics) {
 		return checkModeAndValue(obj, PACKAGE.getModeLabel_InitialValue(), obj.getMode(), obj.getInitialValue(), diagnostics);
@@ -152,7 +172,9 @@
 	public static boolean validateInvariants(ModeValue obj, DiagnosticChain diagnostics) {
 		ModeLabel modeLabel = obj.getLabel();
 		if (modeLabel == null) {
-			addError(obj, PACKAGE.getModeValue_Label(), obj.eClass().getName() + ": missing mode label", diagnostics);
+			// This case is already handled by standard EMF validations (definition ModeLabel[1])
+			// Manual diagnostics entry would be:
+			// addError(obj, PACKAGE.getModeValue_Label(), obj.eClass().getName() + ": missing mode label", diagnostics)
 			return false;
 		}
 
@@ -162,7 +184,9 @@
 	public static boolean validateInvariants(ModeLabelAccess obj, DiagnosticChain diagnostics) {
 		ModeLabel modeLabel = obj.getData();
 		if (modeLabel == null) {
-			addError(obj, PACKAGE.getModeLabelAccess_Data(), obj.eClass().getName() + ": missing mode label", diagnostics);
+			// This case is already handled by standard EMF validations (definition ModeLabel[1])
+			// Manual diagnostics entry would be:
+			// addError(obj, PACKAGE.getModeLabelAccess_Data(), obj.eClass().getName() + ": missing mode label", diagnostics)
 			return false;
 		}
 
@@ -173,6 +197,28 @@
 		return true;
 	}
 
+	public static boolean validateInvariants(ModeLabelAssignment obj, DiagnosticChain diagnostics) {
+		if  (obj.getGlobalLabel() != null && obj.getLocalLabel() != null) {
+			ModeLabel label1 = obj.getGlobalLabel();
+			LocalModeLabel label2 = obj.getLocalLabel();
+
+			return checkModeCompatibility(obj, PACKAGE.getModeLabelAssignment_LocalLabel(), label1.getMode(), label2.getMode(), diagnostics);
+		}
+
+		return true;
+	}
+
+	public static boolean validateInvariants(ModeLabelCondition obj, DiagnosticChain diagnostics) {
+		if  (obj.getLabel1() != null && obj.getLabel2() != null) {
+			ModeLabel label1 = obj.getLabel1();
+			ModeLabel label2 = obj.getLabel2();
+
+			return checkModeCompatibility(obj, PACKAGE.getModeLabelAssignment_LocalLabel(), label1.getMode(), label2.getMode(), diagnostics);
+		}
+
+		return true;
+	}
+
 	private static boolean checkModeAndValue(EObject obj, EStructuralFeature feature, Mode mode, String value, DiagnosticChain diagnostics) {
 		if (mode == null) {
 			addWarning(obj, feature, obj.eClass().getName() + ": unknown value type (mode)", diagnostics);
@@ -209,6 +255,14 @@
 		return true;
 	}
 
+	private static boolean checkModeCompatibility(EObject obj, EStructuralFeature feature, Mode mode1, Mode mode2, DiagnosticChain diagnostics) {
+		if (mode1 != null && mode2 != null && !mode1.equals(mode2)) {
+			addError(obj, feature, obj.eClass().getName() + ": incompatible modes", diagnostics);
+			return false;
+		}
+
+		return true;
+	}
 
 	// private helper methods
 
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/AmaltheaPackage.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/AmaltheaPackage.java
index 4a0e65d..e798be6 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/AmaltheaPackage.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/AmaltheaPackage.java
@@ -25951,13 +25951,22 @@
 	int MODE_LABEL_CONDITION___IS_SATISFIED_BY__EMAP = BASE_OBJECT_OPERATION_COUNT + 1;
 
 	/**
+	 * The operation id for the '<em>Validate Invariants</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODE_LABEL_CONDITION___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP = BASE_OBJECT_OPERATION_COUNT + 2;
+
+	/**
 	 * The number of operations of the '<em>Mode Label Condition</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int MODE_LABEL_CONDITION_OPERATION_COUNT = BASE_OBJECT_OPERATION_COUNT + 2;
+	int MODE_LABEL_CONDITION_OPERATION_COUNT = BASE_OBJECT_OPERATION_COUNT + 3;
 
 	/**
 	 * The feature id for the '<em><b>Custom Properties</b></em>' map.
@@ -38744,15 +38753,6 @@
 	int LOCAL_MODE_LABEL___GET_ENCODED_QUALIFIED_NAME = REFERABLE_BASE_OBJECT___GET_ENCODED_QUALIFIED_NAME;
 
 	/**
-	 * The operation id for the '<em>Validate Invariants</em>' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int LOCAL_MODE_LABEL___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP = REFERABLE_BASE_OBJECT___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP;
-
-	/**
 	 * The operation id for the '<em>Get Name Prefix Segments</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -38762,13 +38762,40 @@
 	int LOCAL_MODE_LABEL___GET_NAME_PREFIX_SEGMENTS = REFERABLE_BASE_OBJECT_OPERATION_COUNT + 0;
 
 	/**
+	 * The operation id for the '<em>Validate Invariants</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOCAL_MODE_LABEL___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP = REFERABLE_BASE_OBJECT_OPERATION_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>Is Enum</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOCAL_MODE_LABEL___IS_ENUM = REFERABLE_BASE_OBJECT_OPERATION_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>Is Numeric</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOCAL_MODE_LABEL___IS_NUMERIC = REFERABLE_BASE_OBJECT_OPERATION_COUNT + 3;
+
+	/**
 	 * The number of operations of the '<em>Local Mode Label</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int LOCAL_MODE_LABEL_OPERATION_COUNT = REFERABLE_BASE_OBJECT_OPERATION_COUNT + 1;
+	int LOCAL_MODE_LABEL_OPERATION_COUNT = REFERABLE_BASE_OBJECT_OPERATION_COUNT + 4;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.model.impl.LocalModeValueImpl <em>Local Mode Value</em>}' class.
@@ -38808,13 +38835,22 @@
 	int LOCAL_MODE_VALUE_FEATURE_COUNT = 2;
 
 	/**
+	 * The operation id for the '<em>Validate Invariants</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOCAL_MODE_VALUE___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP = 0;
+
+	/**
 	 * The number of operations of the '<em>Local Mode Value</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int LOCAL_MODE_VALUE_OPERATION_COUNT = 0;
+	int LOCAL_MODE_VALUE_OPERATION_COUNT = 1;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.model.impl.LocalModeLabelAssignmentImpl <em>Local Mode Label Assignment</em>}' class.
@@ -38904,6 +38940,15 @@
 	int LOCAL_MODE_LABEL_ASSIGNMENT_FEATURE_COUNT = LOCAL_MODE_VALUE_FEATURE_COUNT + 5;
 
 	/**
+	 * The operation id for the '<em>Validate Invariants</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOCAL_MODE_LABEL_ASSIGNMENT___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP = LOCAL_MODE_VALUE___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP;
+
+	/**
 	 * The number of operations of the '<em>Local Mode Label Assignment</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -38968,6 +39013,15 @@
 	int LOCAL_MODE_CONDITION_FEATURE_COUNT = LOCAL_MODE_VALUE_FEATURE_COUNT + 2;
 
 	/**
+	 * The operation id for the '<em>Validate Invariants</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOCAL_MODE_CONDITION___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP = LOCAL_MODE_VALUE___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP;
+
+	/**
 	 * The number of operations of the '<em>Local Mode Condition</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -38996,13 +39050,40 @@
 	int ILOCAL_MODE_VALUE_SOURCE_FEATURE_COUNT = 0;
 
 	/**
+	 * The operation id for the '<em>Is Enum</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ILOCAL_MODE_VALUE_SOURCE___IS_ENUM = 0;
+
+	/**
+	 * The operation id for the '<em>Is Numeric</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ILOCAL_MODE_VALUE_SOURCE___IS_NUMERIC = 1;
+
+	/**
+	 * The operation id for the '<em>Get Mode</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ILOCAL_MODE_VALUE_SOURCE___GET_MODE = 2;
+
+	/**
 	 * The number of operations of the '<em>ILocal Mode Value Source</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT = 0;
+	int ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT = 3;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.model.impl.ModeLiteralConstImpl <em>Mode Literal Const</em>}' class.
@@ -39033,13 +39114,40 @@
 	int MODE_LITERAL_CONST_FEATURE_COUNT = ILOCAL_MODE_VALUE_SOURCE_FEATURE_COUNT + 1;
 
 	/**
+	 * The operation id for the '<em>Is Numeric</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODE_LITERAL_CONST___IS_NUMERIC = ILOCAL_MODE_VALUE_SOURCE___IS_NUMERIC;
+
+	/**
+	 * The operation id for the '<em>Is Enum</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODE_LITERAL_CONST___IS_ENUM = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>Get Mode</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODE_LITERAL_CONST___GET_MODE = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 1;
+
+	/**
 	 * The number of operations of the '<em>Mode Literal Const</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int MODE_LITERAL_CONST_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+	int MODE_LITERAL_CONST_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 2;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.model.impl.IntegerConstImpl <em>Integer Const</em>}' class.
@@ -39070,13 +39178,40 @@
 	int INTEGER_CONST_FEATURE_COUNT = ILOCAL_MODE_VALUE_SOURCE_FEATURE_COUNT + 1;
 
 	/**
+	 * The operation id for the '<em>Is Enum</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTEGER_CONST___IS_ENUM = ILOCAL_MODE_VALUE_SOURCE___IS_ENUM;
+
+	/**
+	 * The operation id for the '<em>Get Mode</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTEGER_CONST___GET_MODE = ILOCAL_MODE_VALUE_SOURCE___GET_MODE;
+
+	/**
+	 * The operation id for the '<em>Is Numeric</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INTEGER_CONST___IS_NUMERIC = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+
+	/**
 	 * The number of operations of the '<em>Integer Const</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int INTEGER_CONST_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+	int INTEGER_CONST_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 1;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.model.impl.ModeLabelRefImpl <em>Mode Label Ref</em>}' class.
@@ -39107,13 +39242,40 @@
 	int MODE_LABEL_REF_FEATURE_COUNT = ILOCAL_MODE_VALUE_SOURCE_FEATURE_COUNT + 1;
 
 	/**
+	 * The operation id for the '<em>Is Enum</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODE_LABEL_REF___IS_ENUM = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>Is Numeric</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODE_LABEL_REF___IS_NUMERIC = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>Get Mode</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODE_LABEL_REF___GET_MODE = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 2;
+
+	/**
 	 * The number of operations of the '<em>Mode Label Ref</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int MODE_LABEL_REF_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+	int MODE_LABEL_REF_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 3;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.model.impl.LocalModeLabelRefImpl <em>Local Mode Label Ref</em>}' class.
@@ -39144,13 +39306,40 @@
 	int LOCAL_MODE_LABEL_REF_FEATURE_COUNT = ILOCAL_MODE_VALUE_SOURCE_FEATURE_COUNT + 1;
 
 	/**
+	 * The operation id for the '<em>Is Enum</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOCAL_MODE_LABEL_REF___IS_ENUM = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>Is Numeric</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOCAL_MODE_LABEL_REF___IS_NUMERIC = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>Get Mode</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int LOCAL_MODE_LABEL_REF___GET_MODE = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 2;
+
+	/**
 	 * The number of operations of the '<em>Local Mode Label Ref</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int LOCAL_MODE_LABEL_REF_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+	int LOCAL_MODE_LABEL_REF_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 3;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.model.impl.ChannelFillRefImpl <em>Channel Fill Ref</em>}' class.
@@ -39181,13 +39370,40 @@
 	int CHANNEL_FILL_REF_FEATURE_COUNT = ILOCAL_MODE_VALUE_SOURCE_FEATURE_COUNT + 1;
 
 	/**
+	 * The operation id for the '<em>Is Enum</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL_FILL_REF___IS_ENUM = ILOCAL_MODE_VALUE_SOURCE___IS_ENUM;
+
+	/**
+	 * The operation id for the '<em>Get Mode</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL_FILL_REF___GET_MODE = ILOCAL_MODE_VALUE_SOURCE___GET_MODE;
+
+	/**
+	 * The operation id for the '<em>Is Numeric</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int CHANNEL_FILL_REF___IS_NUMERIC = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+
+	/**
 	 * The number of operations of the '<em>Channel Fill Ref</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int CHANNEL_FILL_REF_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+	int CHANNEL_FILL_REF_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 1;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.model.impl.ArithmeticExpressionImpl <em>Arithmetic Expression</em>}' class.
@@ -39236,13 +39452,40 @@
 	int ARITHMETIC_EXPRESSION_FEATURE_COUNT = ILOCAL_MODE_VALUE_SOURCE_FEATURE_COUNT + 3;
 
 	/**
+	 * The operation id for the '<em>Is Enum</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_EXPRESSION___IS_ENUM = ILOCAL_MODE_VALUE_SOURCE___IS_ENUM;
+
+	/**
+	 * The operation id for the '<em>Get Mode</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_EXPRESSION___GET_MODE = ILOCAL_MODE_VALUE_SOURCE___GET_MODE;
+
+	/**
+	 * The operation id for the '<em>Is Numeric</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ARITHMETIC_EXPRESSION___IS_NUMERIC = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+
+	/**
 	 * The number of operations of the '<em>Arithmetic Expression</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int ARITHMETIC_EXPRESSION_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 0;
+	int ARITHMETIC_EXPRESSION_OPERATION_COUNT = ILOCAL_MODE_VALUE_SOURCE_OPERATION_COUNT + 1;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.model.impl.ModeLabelAssignmentImpl <em>Mode Label Assignment</em>}' class.
@@ -39332,13 +39575,22 @@
 	int MODE_LABEL_ASSIGNMENT_FEATURE_COUNT = ACTIVITY_GRAPH_ITEM_FEATURE_COUNT + 2;
 
 	/**
+	 * The operation id for the '<em>Validate Invariants</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODE_LABEL_ASSIGNMENT___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP = ACTIVITY_GRAPH_ITEM_OPERATION_COUNT + 0;
+
+	/**
 	 * The number of operations of the '<em>Mode Label Assignment</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int MODE_LABEL_ASSIGNMENT_OPERATION_COUNT = ACTIVITY_GRAPH_ITEM_OPERATION_COUNT + 0;
+	int MODE_LABEL_ASSIGNMENT_OPERATION_COUNT = ACTIVITY_GRAPH_ITEM_OPERATION_COUNT + 1;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.app4mc.amalthea.model.RelationalOperator <em>Relational Operator</em>}' enum.
@@ -48700,6 +48952,16 @@
 	EOperation getModeLabelCondition__IsSatisfiedBy__EMap();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ModeLabelCondition#validateInvariants(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Invariants</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Invariants</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ModeLabelCondition#validateInvariants(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getModeLabelCondition__ValidateInvariants__DiagnosticChain_Map();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.model.ConditionDisjunction <em>Condition Disjunction</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -52407,6 +52669,36 @@
 	EOperation getLocalModeLabel__GetNamePrefixSegments();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.LocalModeLabel#validateInvariants(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Invariants</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Invariants</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.LocalModeLabel#validateInvariants(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getLocalModeLabel__ValidateInvariants__DiagnosticChain_Map();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.LocalModeLabel#isEnum() <em>Is Enum</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Enum</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.LocalModeLabel#isEnum()
+	 * @generated
+	 */
+	EOperation getLocalModeLabel__IsEnum();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.LocalModeLabel#isNumeric() <em>Is Numeric</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Numeric</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.LocalModeLabel#isNumeric()
+	 * @generated
+	 */
+	EOperation getLocalModeLabel__IsNumeric();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.model.LocalModeValue <em>Local Mode Value</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -52439,6 +52731,16 @@
 	EReference getLocalModeValue_ValueSource();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.LocalModeValue#validateInvariants(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Invariants</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Invariants</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.LocalModeValue#validateInvariants(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getLocalModeValue__ValidateInvariants__DiagnosticChain_Map();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.model.LocalModeLabelAssignment <em>Local Mode Label Assignment</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -52480,6 +52782,36 @@
 	EClass getILocalModeValueSource();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ILocalModeValueSource#isEnum() <em>Is Enum</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Enum</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ILocalModeValueSource#isEnum()
+	 * @generated
+	 */
+	EOperation getILocalModeValueSource__IsEnum();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ILocalModeValueSource#isNumeric() <em>Is Numeric</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Numeric</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ILocalModeValueSource#isNumeric()
+	 * @generated
+	 */
+	EOperation getILocalModeValueSource__IsNumeric();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ILocalModeValueSource#getMode() <em>Get Mode</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Get Mode</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ILocalModeValueSource#getMode()
+	 * @generated
+	 */
+	EOperation getILocalModeValueSource__GetMode();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.model.ModeLiteralConst <em>Mode Literal Const</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -52501,6 +52833,26 @@
 	EReference getModeLiteralConst_Value();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ModeLiteralConst#isEnum() <em>Is Enum</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Enum</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ModeLiteralConst#isEnum()
+	 * @generated
+	 */
+	EOperation getModeLiteralConst__IsEnum();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ModeLiteralConst#getMode() <em>Get Mode</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Get Mode</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ModeLiteralConst#getMode()
+	 * @generated
+	 */
+	EOperation getModeLiteralConst__GetMode();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.model.IntegerConst <em>Integer Const</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -52522,6 +52874,16 @@
 	EAttribute getIntegerConst_Value();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.IntegerConst#isNumeric() <em>Is Numeric</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Numeric</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.IntegerConst#isNumeric()
+	 * @generated
+	 */
+	EOperation getIntegerConst__IsNumeric();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.model.ModeLabelRef <em>Mode Label Ref</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -52543,6 +52905,36 @@
 	EReference getModeLabelRef_Value();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ModeLabelRef#isEnum() <em>Is Enum</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Enum</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ModeLabelRef#isEnum()
+	 * @generated
+	 */
+	EOperation getModeLabelRef__IsEnum();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ModeLabelRef#isNumeric() <em>Is Numeric</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Numeric</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ModeLabelRef#isNumeric()
+	 * @generated
+	 */
+	EOperation getModeLabelRef__IsNumeric();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ModeLabelRef#getMode() <em>Get Mode</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Get Mode</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ModeLabelRef#getMode()
+	 * @generated
+	 */
+	EOperation getModeLabelRef__GetMode();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.model.LocalModeLabelRef <em>Local Mode Label Ref</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -52564,6 +52956,36 @@
 	EReference getLocalModeLabelRef_Value();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.LocalModeLabelRef#isEnum() <em>Is Enum</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Enum</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.LocalModeLabelRef#isEnum()
+	 * @generated
+	 */
+	EOperation getLocalModeLabelRef__IsEnum();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.LocalModeLabelRef#isNumeric() <em>Is Numeric</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Numeric</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.LocalModeLabelRef#isNumeric()
+	 * @generated
+	 */
+	EOperation getLocalModeLabelRef__IsNumeric();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.LocalModeLabelRef#getMode() <em>Get Mode</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Get Mode</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.LocalModeLabelRef#getMode()
+	 * @generated
+	 */
+	EOperation getLocalModeLabelRef__GetMode();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.model.ChannelFillRef <em>Channel Fill Ref</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -52585,6 +53007,16 @@
 	EReference getChannelFillRef_Value();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ChannelFillRef#isNumeric() <em>Is Numeric</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Numeric</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ChannelFillRef#isNumeric()
+	 * @generated
+	 */
+	EOperation getChannelFillRef__IsNumeric();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.model.ArithmeticExpression <em>Arithmetic Expression</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -52628,6 +53060,16 @@
 	EAttribute getArithmeticExpression_Operator();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ArithmeticExpression#isNumeric() <em>Is Numeric</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Is Numeric</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ArithmeticExpression#isNumeric()
+	 * @generated
+	 */
+	EOperation getArithmeticExpression__IsNumeric();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.app4mc.amalthea.model.ModeLabelAssignment <em>Mode Label Assignment</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -52660,6 +53102,16 @@
 	EReference getModeLabelAssignment_LocalLabel();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.app4mc.amalthea.model.ModeLabelAssignment#validateInvariants(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map) <em>Validate Invariants</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Validate Invariants</em>' operation.
+	 * @see org.eclipse.app4mc.amalthea.model.ModeLabelAssignment#validateInvariants(org.eclipse.emf.common.util.DiagnosticChain, java.util.Map)
+	 * @generated
+	 */
+	EOperation getModeLabelAssignment__ValidateInvariants__DiagnosticChain_Map();
+
+	/**
 	 * Returns the meta object for enum '{@link org.eclipse.app4mc.amalthea.model.RelationalOperator <em>Relational Operator</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ArithmeticExpression.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ArithmeticExpression.java
index 83503ff..53c9b8d 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ArithmeticExpression.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ArithmeticExpression.java
@@ -103,4 +103,12 @@
 	 */
 	void setOperator(ArithmeticOperator value);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isNumeric();
+
 } // ArithmeticExpression
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ChannelFillRef.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ChannelFillRef.java
index 6f22803..f87cb3c 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ChannelFillRef.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ChannelFillRef.java
@@ -54,4 +54,12 @@
 	 */
 	void setValue(Channel value);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isNumeric();
+
 } // ChannelFillRef
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ILocalModeValueSource.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ILocalModeValueSource.java
index ddbdebf..04326f1 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ILocalModeValueSource.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ILocalModeValueSource.java
@@ -27,4 +27,28 @@
  * @generated
  */
 public interface ILocalModeValueSource extends EObject {
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isEnum();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isNumeric();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	Mode getMode();
 } // ILocalModeValueSource
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/IntegerConst.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/IntegerConst.java
index f7bdb6d..839017d 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/IntegerConst.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/IntegerConst.java
@@ -55,4 +55,12 @@
 	 */
 	void setValue(int value);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isNumeric();
+
 } // IntegerConst
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeLabel.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeLabel.java
index 1374eed..8cdfebd 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeLabel.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeLabel.java
@@ -14,6 +14,8 @@
  */
 package org.eclipse.app4mc.amalthea.model;
 
+import java.util.Map;
+import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 
 /**
@@ -100,4 +102,28 @@
 	 */
 	EList<String> getNamePrefixSegments();
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model unique="false" diagnosticsUnique="false" contextUnique="false"
+	 * @generated
+	 */
+	boolean validateInvariants(DiagnosticChain diagnostics, Map<Object, Object> context);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isEnum();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isNumeric();
+
 } // LocalModeLabel
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeLabelRef.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeLabelRef.java
index 7e34768..127975e 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeLabelRef.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeLabelRef.java
@@ -54,4 +54,28 @@
 	 */
 	void setValue(LocalModeLabel value);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isEnum();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isNumeric();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	Mode getMode();
+
 } // LocalStateRef
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeValue.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeValue.java
index d43b469..e33b8cc 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeValue.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/LocalModeValue.java
@@ -14,6 +14,8 @@
  */
 package org.eclipse.app4mc.amalthea.model;
 
+import java.util.Map;
+import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.ecore.EObject;
 
 /**
@@ -78,4 +80,12 @@
 	 */
 	void setValueSource(ILocalModeValueSource value);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model unique="false" diagnosticsUnique="false" contextUnique="false"
+	 * @generated
+	 */
+	boolean validateInvariants(DiagnosticChain diagnostics, Map<Object, Object> context);
+
 } // LocalModeValue
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelAssignment.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelAssignment.java
index bec379d..fcc319e 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelAssignment.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelAssignment.java
@@ -14,6 +14,9 @@
  */
 package org.eclipse.app4mc.amalthea.model;
 
+import java.util.Map;
+import org.eclipse.emf.common.util.DiagnosticChain;
+
 
 /**
  * <!-- begin-user-doc -->
@@ -77,4 +80,12 @@
 	 */
 	void setLocalLabel(LocalModeLabel value);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model unique="false" diagnosticsUnique="false" contextUnique="false"
+	 * @generated
+	 */
+	boolean validateInvariants(DiagnosticChain diagnostics, Map<Object, Object> context);
+
 } // ModeLabelAssignment
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelCondition.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelCondition.java
index 743d7e4..7c7ece7 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelCondition.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelCondition.java
@@ -14,6 +14,8 @@
  */
 package org.eclipse.app4mc.amalthea.model;
 
+import java.util.Map;
+import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EMap;
 
 /**
@@ -86,4 +88,12 @@
 	 */
 	boolean isSatisfiedBy(EMap<ModeLabel, String> context);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model unique="false" diagnosticsUnique="false" contextUnique="false"
+	 * @generated
+	 */
+	boolean validateInvariants(DiagnosticChain diagnostics, Map<Object, Object> context);
+
 } // ModeLabelCondition
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelRef.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelRef.java
index de90e54..96901a5 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelRef.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLabelRef.java
@@ -54,4 +54,28 @@
 	 */
 	void setValue(ModeLabel value);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isEnum();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isNumeric();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	Mode getMode();
+
 } // ModeLabelRef
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLiteralConst.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLiteralConst.java
index 8d4e58c..182a439 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLiteralConst.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/ModeLiteralConst.java
@@ -54,4 +54,20 @@
 	 */
 	void setValue(ModeLiteral value);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	boolean isEnum();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation" unique="false"
+	 * @generated
+	 */
+	Mode getMode();
+
 } // ModeLiteralConst
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/AmaltheaPackageImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/AmaltheaPackageImpl.java
index 7220d4f..fdeb150 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/AmaltheaPackageImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/AmaltheaPackageImpl.java
@@ -11405,6 +11405,16 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getModeLabelCondition__ValidateInvariants__DiagnosticChain_Map() {
+		return modeLabelConditionEClass.getEOperations().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getConditionDisjunction() {
 		return conditionDisjunctionEClass;
 	}
@@ -14885,6 +14895,36 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getLocalModeLabel__ValidateInvariants__DiagnosticChain_Map() {
+		return localModeLabelEClass.getEOperations().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getLocalModeLabel__IsEnum() {
+		return localModeLabelEClass.getEOperations().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getLocalModeLabel__IsNumeric() {
+		return localModeLabelEClass.getEOperations().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getLocalModeValue() {
 		return localModeValueEClass;
 	}
@@ -14915,6 +14955,16 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getLocalModeValue__ValidateInvariants__DiagnosticChain_Map() {
+		return localModeValueEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getLocalModeLabelAssignment() {
 		return localModeLabelAssignmentEClass;
 	}
@@ -14955,6 +15005,36 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getILocalModeValueSource__IsEnum() {
+		return iLocalModeValueSourceEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getILocalModeValueSource__IsNumeric() {
+		return iLocalModeValueSourceEClass.getEOperations().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getILocalModeValueSource__GetMode() {
+		return iLocalModeValueSourceEClass.getEOperations().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getModeLiteralConst() {
 		return modeLiteralConstEClass;
 	}
@@ -14975,6 +15055,26 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getModeLiteralConst__IsEnum() {
+		return modeLiteralConstEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getModeLiteralConst__GetMode() {
+		return modeLiteralConstEClass.getEOperations().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getIntegerConst() {
 		return integerConstEClass;
 	}
@@ -14995,6 +15095,16 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getIntegerConst__IsNumeric() {
+		return integerConstEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getModeLabelRef() {
 		return modeLabelRefEClass;
 	}
@@ -15015,6 +15125,36 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getModeLabelRef__IsEnum() {
+		return modeLabelRefEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getModeLabelRef__IsNumeric() {
+		return modeLabelRefEClass.getEOperations().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getModeLabelRef__GetMode() {
+		return modeLabelRefEClass.getEOperations().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getLocalModeLabelRef() {
 		return localModeLabelRefEClass;
 	}
@@ -15035,6 +15175,36 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getLocalModeLabelRef__IsEnum() {
+		return localModeLabelRefEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getLocalModeLabelRef__IsNumeric() {
+		return localModeLabelRefEClass.getEOperations().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getLocalModeLabelRef__GetMode() {
+		return localModeLabelRefEClass.getEOperations().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getChannelFillRef() {
 		return channelFillRefEClass;
 	}
@@ -15055,6 +15225,16 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getChannelFillRef__IsNumeric() {
+		return channelFillRefEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getArithmeticExpression() {
 		return arithmeticExpressionEClass;
 	}
@@ -15095,6 +15275,16 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getArithmeticExpression__IsNumeric() {
+		return arithmeticExpressionEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getModeLabelAssignment() {
 		return modeLabelAssignmentEClass;
 	}
@@ -15125,6 +15315,16 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getModeLabelAssignment__ValidateInvariants__DiagnosticChain_Map() {
+		return modeLabelAssignmentEClass.getEOperations().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EEnum getRelationalOperator() {
 		return relationalOperatorEEnum;
 	}
@@ -16931,6 +17131,7 @@
 		createEReference(modeLabelConditionEClass, MODE_LABEL_CONDITION__LABEL1);
 		createEReference(modeLabelConditionEClass, MODE_LABEL_CONDITION__LABEL2);
 		createEOperation(modeLabelConditionEClass, MODE_LABEL_CONDITION___IS_SATISFIED_BY__EMAP);
+		createEOperation(modeLabelConditionEClass, MODE_LABEL_CONDITION___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP);
 
 		conditionDisjunctionEClass = createEClass(CONDITION_DISJUNCTION);
 		createEReference(conditionDisjunctionEClass, CONDITION_DISJUNCTION__ENTRIES);
@@ -17383,10 +17584,14 @@
 		createEReference(localModeLabelEClass, LOCAL_MODE_LABEL__MODE);
 		createEAttribute(localModeLabelEClass, LOCAL_MODE_LABEL__DEFAULT_VALUE);
 		createEOperation(localModeLabelEClass, LOCAL_MODE_LABEL___GET_NAME_PREFIX_SEGMENTS);
+		createEOperation(localModeLabelEClass, LOCAL_MODE_LABEL___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP);
+		createEOperation(localModeLabelEClass, LOCAL_MODE_LABEL___IS_ENUM);
+		createEOperation(localModeLabelEClass, LOCAL_MODE_LABEL___IS_NUMERIC);
 
 		localModeValueEClass = createEClass(LOCAL_MODE_VALUE);
 		createEReference(localModeValueEClass, LOCAL_MODE_VALUE__LABEL);
 		createEReference(localModeValueEClass, LOCAL_MODE_VALUE__VALUE_SOURCE);
+		createEOperation(localModeValueEClass, LOCAL_MODE_VALUE___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP);
 
 		localModeLabelAssignmentEClass = createEClass(LOCAL_MODE_LABEL_ASSIGNMENT);
 
@@ -17394,30 +17599,45 @@
 		createEAttribute(localModeConditionEClass, LOCAL_MODE_CONDITION__RELATION);
 
 		iLocalModeValueSourceEClass = createEClass(ILOCAL_MODE_VALUE_SOURCE);
+		createEOperation(iLocalModeValueSourceEClass, ILOCAL_MODE_VALUE_SOURCE___IS_ENUM);
+		createEOperation(iLocalModeValueSourceEClass, ILOCAL_MODE_VALUE_SOURCE___IS_NUMERIC);
+		createEOperation(iLocalModeValueSourceEClass, ILOCAL_MODE_VALUE_SOURCE___GET_MODE);
 
 		modeLiteralConstEClass = createEClass(MODE_LITERAL_CONST);
 		createEReference(modeLiteralConstEClass, MODE_LITERAL_CONST__VALUE);
+		createEOperation(modeLiteralConstEClass, MODE_LITERAL_CONST___IS_ENUM);
+		createEOperation(modeLiteralConstEClass, MODE_LITERAL_CONST___GET_MODE);
 
 		integerConstEClass = createEClass(INTEGER_CONST);
 		createEAttribute(integerConstEClass, INTEGER_CONST__VALUE);
+		createEOperation(integerConstEClass, INTEGER_CONST___IS_NUMERIC);
 
 		modeLabelRefEClass = createEClass(MODE_LABEL_REF);
 		createEReference(modeLabelRefEClass, MODE_LABEL_REF__VALUE);
+		createEOperation(modeLabelRefEClass, MODE_LABEL_REF___IS_ENUM);
+		createEOperation(modeLabelRefEClass, MODE_LABEL_REF___IS_NUMERIC);
+		createEOperation(modeLabelRefEClass, MODE_LABEL_REF___GET_MODE);
 
 		localModeLabelRefEClass = createEClass(LOCAL_MODE_LABEL_REF);
 		createEReference(localModeLabelRefEClass, LOCAL_MODE_LABEL_REF__VALUE);
+		createEOperation(localModeLabelRefEClass, LOCAL_MODE_LABEL_REF___IS_ENUM);
+		createEOperation(localModeLabelRefEClass, LOCAL_MODE_LABEL_REF___IS_NUMERIC);
+		createEOperation(localModeLabelRefEClass, LOCAL_MODE_LABEL_REF___GET_MODE);
 
 		channelFillRefEClass = createEClass(CHANNEL_FILL_REF);
 		createEReference(channelFillRefEClass, CHANNEL_FILL_REF__VALUE);
+		createEOperation(channelFillRefEClass, CHANNEL_FILL_REF___IS_NUMERIC);
 
 		arithmeticExpressionEClass = createEClass(ARITHMETIC_EXPRESSION);
 		createEReference(arithmeticExpressionEClass, ARITHMETIC_EXPRESSION__OPERAND1);
 		createEReference(arithmeticExpressionEClass, ARITHMETIC_EXPRESSION__OPERAND2);
 		createEAttribute(arithmeticExpressionEClass, ARITHMETIC_EXPRESSION__OPERATOR);
+		createEOperation(arithmeticExpressionEClass, ARITHMETIC_EXPRESSION___IS_NUMERIC);
 
 		modeLabelAssignmentEClass = createEClass(MODE_LABEL_ASSIGNMENT);
 		createEReference(modeLabelAssignmentEClass, MODE_LABEL_ASSIGNMENT__GLOBAL_LABEL);
 		createEReference(modeLabelAssignmentEClass, MODE_LABEL_ASSIGNMENT__LOCAL_LABEL);
+		createEOperation(modeLabelAssignmentEClass, MODE_LABEL_ASSIGNMENT___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP);
 
 		// Create enums
 		relationalOperatorEEnum = createEEnum(RELATIONAL_OPERATOR);
@@ -19215,6 +19435,15 @@
 		op = initEOperation(getModeLabelCondition__IsSatisfiedBy__EMap(), theEcorePackage.getEBoolean(), "isSatisfiedBy", 0, 1, !IS_UNIQUE, IS_ORDERED);
 		addEParameter(op, this.getModeValueMapEntry(), "context", 0, -1, !IS_UNIQUE, IS_ORDERED);
 
+		op = initEOperation(getModeLabelCondition__ValidateInvariants__DiagnosticChain_Map(), theEcorePackage.getEBoolean(), "validateInvariants", 0, 1, !IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, theEcorePackage.getEDiagnosticChain(), "diagnostics", 0, 1, !IS_UNIQUE, IS_ORDERED);
+		g1 = createEGenericType(theEcorePackage.getEMap());
+		g2 = createEGenericType(theEcorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(theEcorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(conditionDisjunctionEClass, ConditionDisjunction.class, "ConditionDisjunction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getConditionDisjunction_Entries(), this.getConditionDisjunctionEntry(), null, "entries", null, 1, -1, ConditionDisjunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
@@ -19695,10 +19924,32 @@
 
 		initEOperation(getLocalModeLabel__GetNamePrefixSegments(), theEcorePackage.getEString(), "getNamePrefixSegments", 0, -1, !IS_UNIQUE, IS_ORDERED);
 
+		op = initEOperation(getLocalModeLabel__ValidateInvariants__DiagnosticChain_Map(), theEcorePackage.getEBoolean(), "validateInvariants", 0, 1, !IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, theEcorePackage.getEDiagnosticChain(), "diagnostics", 0, 1, !IS_UNIQUE, IS_ORDERED);
+		g1 = createEGenericType(theEcorePackage.getEMap());
+		g2 = createEGenericType(theEcorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(theEcorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
+		initEOperation(getLocalModeLabel__IsEnum(), theEcorePackage.getEBoolean(), "isEnum", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
+		initEOperation(getLocalModeLabel__IsNumeric(), theEcorePackage.getEBoolean(), "isNumeric", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(localModeValueEClass, LocalModeValue.class, "LocalModeValue", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getLocalModeValue_Label(), this.getLocalModeLabel(), null, "label", null, 1, 1, LocalModeValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getLocalModeValue_ValueSource(), this.getILocalModeValueSource(), null, "valueSource", null, 1, 1, LocalModeValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		op = initEOperation(getLocalModeValue__ValidateInvariants__DiagnosticChain_Map(), theEcorePackage.getEBoolean(), "validateInvariants", 0, 1, !IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, theEcorePackage.getEDiagnosticChain(), "diagnostics", 0, 1, !IS_UNIQUE, IS_ORDERED);
+		g1 = createEGenericType(theEcorePackage.getEMap());
+		g2 = createEGenericType(theEcorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(theEcorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(localModeLabelAssignmentEClass, LocalModeLabelAssignment.class, "LocalModeLabelAssignment", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
 		initEClass(localModeConditionEClass, LocalModeCondition.class, "LocalModeCondition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -19706,30 +19957,67 @@
 
 		initEClass(iLocalModeValueSourceEClass, ILocalModeValueSource.class, "ILocalModeValueSource", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
+		initEOperation(getILocalModeValueSource__IsEnum(), theEcorePackage.getEBoolean(), "isEnum", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
+		initEOperation(getILocalModeValueSource__IsNumeric(), theEcorePackage.getEBoolean(), "isNumeric", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
+		initEOperation(getILocalModeValueSource__GetMode(), this.getMode(), "getMode", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(modeLiteralConstEClass, ModeLiteralConst.class, "ModeLiteralConst", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getModeLiteralConst_Value(), this.getModeLiteral(), null, "value", null, 1, 1, ModeLiteralConst.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEOperation(getModeLiteralConst__IsEnum(), theEcorePackage.getEBoolean(), "isEnum", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
+		initEOperation(getModeLiteralConst__GetMode(), this.getMode(), "getMode", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(integerConstEClass, IntegerConst.class, "IntegerConst", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEAttribute(getIntegerConst_Value(), theEcorePackage.getEInt(), "value", "0", 1, 1, IntegerConst.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEOperation(getIntegerConst__IsNumeric(), theEcorePackage.getEBoolean(), "isNumeric", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(modeLabelRefEClass, ModeLabelRef.class, "ModeLabelRef", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getModeLabelRef_Value(), this.getModeLabel(), null, "value", null, 1, 1, ModeLabelRef.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEOperation(getModeLabelRef__IsEnum(), theEcorePackage.getEBoolean(), "isEnum", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
+		initEOperation(getModeLabelRef__IsNumeric(), theEcorePackage.getEBoolean(), "isNumeric", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
+		initEOperation(getModeLabelRef__GetMode(), this.getMode(), "getMode", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(localModeLabelRefEClass, LocalModeLabelRef.class, "LocalModeLabelRef", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getLocalModeLabelRef_Value(), this.getLocalModeLabel(), null, "value", null, 1, 1, LocalModeLabelRef.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEOperation(getLocalModeLabelRef__IsEnum(), theEcorePackage.getEBoolean(), "isEnum", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
+		initEOperation(getLocalModeLabelRef__IsNumeric(), theEcorePackage.getEBoolean(), "isNumeric", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
+		initEOperation(getLocalModeLabelRef__GetMode(), this.getMode(), "getMode", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(channelFillRefEClass, ChannelFillRef.class, "ChannelFillRef", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getChannelFillRef_Value(), this.getChannel(), null, "value", null, 1, 1, ChannelFillRef.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEOperation(getChannelFillRef__IsNumeric(), theEcorePackage.getEBoolean(), "isNumeric", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(arithmeticExpressionEClass, ArithmeticExpression.class, "ArithmeticExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getArithmeticExpression_Operand1(), this.getILocalModeValueSource(), null, "operand1", null, 0, 1, ArithmeticExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getArithmeticExpression_Operand2(), this.getILocalModeValueSource(), null, "operand2", null, 0, 1, ArithmeticExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getArithmeticExpression_Operator(), this.getArithmeticOperator(), "operator", null, 0, 1, ArithmeticExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEOperation(getArithmeticExpression__IsNumeric(), theEcorePackage.getEBoolean(), "isNumeric", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		initEClass(modeLabelAssignmentEClass, ModeLabelAssignment.class, "ModeLabelAssignment", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getModeLabelAssignment_GlobalLabel(), this.getModeLabel(), null, "globalLabel", null, 1, 1, ModeLabelAssignment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getModeLabelAssignment_LocalLabel(), this.getLocalModeLabel(), null, "localLabel", null, 1, 1, ModeLabelAssignment.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		op = initEOperation(getModeLabelAssignment__ValidateInvariants__DiagnosticChain_Map(), theEcorePackage.getEBoolean(), "validateInvariants", 0, 1, !IS_UNIQUE, IS_ORDERED);
+		addEParameter(op, theEcorePackage.getEDiagnosticChain(), "diagnostics", 0, 1, !IS_UNIQUE, IS_ORDERED);
+		g1 = createEGenericType(theEcorePackage.getEMap());
+		g2 = createEGenericType(theEcorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		g2 = createEGenericType(theEcorePackage.getEJavaObject());
+		g1.getETypeArguments().add(g2);
+		addEParameter(op, g1, "context", 0, 1, !IS_UNIQUE, IS_ORDERED);
+
 		// Initialize enums and add enum literals
 		initEEnum(relationalOperatorEEnum, RelationalOperator.class, "RelationalOperator");
 		addEEnumLiteral(relationalOperatorEEnum, RelationalOperator._UNDEFINED_);
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ArithmeticExpressionImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ArithmeticExpressionImpl.java
index b35067d..fe8891f 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ArithmeticExpressionImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ArithmeticExpressionImpl.java
@@ -14,16 +14,19 @@
  */
 package org.eclipse.app4mc.amalthea.model.impl;
 
+import java.lang.reflect.InvocationTargetException;
 import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
 import org.eclipse.app4mc.amalthea.model.ArithmeticExpression;
 import org.eclipse.app4mc.amalthea.model.ArithmeticOperator;
 import org.eclipse.app4mc.amalthea.model.ILocalModeValueSource;
 
+import org.eclipse.app4mc.amalthea.model.Mode;
 import org.eclipse.app4mc.amalthea.model.emf.AmaltheaEObjectImpl;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -223,6 +226,36 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isNumeric() {
+		return true;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isEnum() {
+		return false;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Mode getMode() {
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case AmaltheaPackage.ARITHMETIC_EXPRESSION__OPERAND1:
@@ -317,6 +350,24 @@
 	 * @generated
 	 */
 	@Override
+	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+		switch (operationID) {
+			case AmaltheaPackage.ARITHMETIC_EXPRESSION___IS_NUMERIC:
+				return isNumeric();
+			case AmaltheaPackage.ARITHMETIC_EXPRESSION___IS_ENUM:
+				return isEnum();
+			case AmaltheaPackage.ARITHMETIC_EXPRESSION___GET_MODE:
+				return getMode();
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public String toString() {
 		if (eIsProxy()) return super.toString();
 
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ChannelFillRefImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ChannelFillRefImpl.java
index 0da00dd..5edeaff 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ChannelFillRefImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ChannelFillRefImpl.java
@@ -14,14 +14,17 @@
  */
 package org.eclipse.app4mc.amalthea.model.impl;
 
+import java.lang.reflect.InvocationTargetException;
 import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
 import org.eclipse.app4mc.amalthea.model.Channel;
 import org.eclipse.app4mc.amalthea.model.ChannelFillRef;
 
+import org.eclipse.app4mc.amalthea.model.Mode;
 import org.eclipse.app4mc.amalthea.model.emf.AmaltheaEObjectImpl;
 
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -116,6 +119,36 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isNumeric() {
+		return true;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isEnum() {
+		return false;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Mode getMode() {
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case AmaltheaPackage.CHANNEL_FILL_REF__VALUE:
@@ -169,4 +202,22 @@
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+		switch (operationID) {
+			case AmaltheaPackage.CHANNEL_FILL_REF___IS_NUMERIC:
+				return isNumeric();
+			case AmaltheaPackage.CHANNEL_FILL_REF___IS_ENUM:
+				return isEnum();
+			case AmaltheaPackage.CHANNEL_FILL_REF___GET_MODE:
+				return getMode();
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
 } //ChannelFillRefImpl
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/IntegerConstImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/IntegerConstImpl.java
index 1a29942..40b22b4 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/IntegerConstImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/IntegerConstImpl.java
@@ -14,13 +14,16 @@
  */
 package org.eclipse.app4mc.amalthea.model.impl;
 
+import java.lang.reflect.InvocationTargetException;
 import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
 import org.eclipse.app4mc.amalthea.model.IntegerConst;
 
+import org.eclipse.app4mc.amalthea.model.Mode;
 import org.eclipse.app4mc.amalthea.model.emf.AmaltheaEObjectImpl;
 
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
@@ -107,6 +110,36 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isNumeric() {
+		return true;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isEnum() {
+		return false;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Mode getMode() {
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case AmaltheaPackage.INTEGER_CONST__VALUE:
@@ -165,6 +198,24 @@
 	 * @generated
 	 */
 	@Override
+	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+		switch (operationID) {
+			case AmaltheaPackage.INTEGER_CONST___IS_NUMERIC:
+				return isNumeric();
+			case AmaltheaPackage.INTEGER_CONST___IS_ENUM:
+				return isEnum();
+			case AmaltheaPackage.INTEGER_CONST___GET_MODE:
+				return getMode();
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public String toString() {
 		if (eIsProxy()) return super.toString();
 
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeLabelImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeLabelImpl.java
index cea4c6b..ddda057 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeLabelImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeLabelImpl.java
@@ -16,16 +16,21 @@
 
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.Map;
 import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
+import org.eclipse.app4mc.amalthea.model.AmaltheaValidations;
+import org.eclipse.app4mc.amalthea.model.EnumMode;
 import org.eclipse.app4mc.amalthea.model.IExecutable;
 import org.eclipse.app4mc.amalthea.model.INamed;
 import org.eclipse.app4mc.amalthea.model.IReferable;
 import org.eclipse.app4mc.amalthea.model.LocalModeLabel;
 import org.eclipse.app4mc.amalthea.model.Mode;
+import org.eclipse.app4mc.amalthea.model.NumericMode;
 import org.eclipse.app4mc.amalthea.model.ReferableBaseObject;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 
 import org.eclipse.emf.ecore.EClass;
@@ -210,6 +215,38 @@
 	 * @generated
 	 */
 	@Override
+	public boolean validateInvariants(final DiagnosticChain diagnostics, final Map<Object, Object> context) {
+		return AmaltheaValidations.validateInvariants(this, diagnostics);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isEnum() {
+		Mode _mode = this.getMode();
+		return (_mode instanceof EnumMode);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isNumeric() {
+		Mode _mode = this.getMode();
+		return (_mode instanceof NumericMode);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case AmaltheaPackage.LOCAL_MODE_LABEL__CONTAINING_EXECUTABLE:
@@ -337,12 +374,14 @@
 		}
 		if (baseClass == IReferable.class) {
 			switch (baseOperationID) {
+				case AmaltheaPackage.IREFERABLE___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP: return AmaltheaPackage.LOCAL_MODE_LABEL___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP;
 				case AmaltheaPackage.IREFERABLE___GET_NAME_PREFIX_SEGMENTS: return AmaltheaPackage.LOCAL_MODE_LABEL___GET_NAME_PREFIX_SEGMENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
 		}
 		if (baseClass == ReferableBaseObject.class) {
 			switch (baseOperationID) {
+				case AmaltheaPackage.REFERABLE_BASE_OBJECT___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP: return AmaltheaPackage.LOCAL_MODE_LABEL___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP;
 				case AmaltheaPackage.REFERABLE_BASE_OBJECT___GET_NAME_PREFIX_SEGMENTS: return AmaltheaPackage.LOCAL_MODE_LABEL___GET_NAME_PREFIX_SEGMENTS;
 				default: return super.eDerivedOperationID(baseOperationID, baseClass);
 			}
@@ -356,10 +395,17 @@
 	 * @generated
 	 */
 	@Override
+	@SuppressWarnings("unchecked")
 	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
 		switch (operationID) {
 			case AmaltheaPackage.LOCAL_MODE_LABEL___GET_NAME_PREFIX_SEGMENTS:
 				return getNamePrefixSegments();
+			case AmaltheaPackage.LOCAL_MODE_LABEL___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP:
+				return validateInvariants((DiagnosticChain)arguments.get(0), (Map<Object, Object>)arguments.get(1));
+			case AmaltheaPackage.LOCAL_MODE_LABEL___IS_ENUM:
+				return isEnum();
+			case AmaltheaPackage.LOCAL_MODE_LABEL___IS_NUMERIC:
+				return isNumeric();
 		}
 		return super.eInvoke(operationID, arguments);
 	}
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeLabelRefImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeLabelRefImpl.java
index 54a672a..a7455ac 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeLabelRefImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeLabelRefImpl.java
@@ -14,14 +14,17 @@
  */
 package org.eclipse.app4mc.amalthea.model.impl;
 
+import java.lang.reflect.InvocationTargetException;
 import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
 import org.eclipse.app4mc.amalthea.model.LocalModeLabel;
 import org.eclipse.app4mc.amalthea.model.LocalModeLabelRef;
 
+import org.eclipse.app4mc.amalthea.model.Mode;
 import org.eclipse.app4mc.amalthea.model.emf.AmaltheaEObjectImpl;
 
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -116,6 +119,41 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isEnum() {
+		return this.getValue().isEnum();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isNumeric() {
+		return this.getValue().isNumeric();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Mode getMode() {
+		LocalModeLabel _value = this.getValue();
+		Mode _mode = null;
+		if (_value!=null) {
+			_mode=_value.getMode();
+		}
+		return _mode;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case AmaltheaPackage.LOCAL_MODE_LABEL_REF__VALUE:
@@ -169,4 +207,22 @@
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+		switch (operationID) {
+			case AmaltheaPackage.LOCAL_MODE_LABEL_REF___IS_ENUM:
+				return isEnum();
+			case AmaltheaPackage.LOCAL_MODE_LABEL_REF___IS_NUMERIC:
+				return isNumeric();
+			case AmaltheaPackage.LOCAL_MODE_LABEL_REF___GET_MODE:
+				return getMode();
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
 } //LocalStateRefImpl
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeValueImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeValueImpl.java
index c458757..36e014b 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeValueImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/LocalModeValueImpl.java
@@ -14,7 +14,10 @@
  */
 package org.eclipse.app4mc.amalthea.model.impl;
 
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
 import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
+import org.eclipse.app4mc.amalthea.model.AmaltheaValidations;
 import org.eclipse.app4mc.amalthea.model.ILocalModeValueSource;
 import org.eclipse.app4mc.amalthea.model.LocalModeLabel;
 import org.eclipse.app4mc.amalthea.model.LocalModeValue;
@@ -24,6 +27,8 @@
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
 
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -174,6 +179,16 @@
 	 * @generated
 	 */
 	@Override
+	public boolean validateInvariants(final DiagnosticChain diagnostics, final Map<Object, Object> context) {
+		return AmaltheaValidations.validateInvariants(this, diagnostics);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case AmaltheaPackage.LOCAL_MODE_VALUE__VALUE_SOURCE:
@@ -251,4 +266,19 @@
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+		switch (operationID) {
+			case AmaltheaPackage.LOCAL_MODE_VALUE___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP:
+				return validateInvariants((DiagnosticChain)arguments.get(0), (Map<Object, Object>)arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
 } //LocalModeValueImpl
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelAssignmentImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelAssignmentImpl.java
index 6e8cf04..45c8a1a 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelAssignmentImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelAssignmentImpl.java
@@ -14,13 +14,18 @@
  */
 package org.eclipse.app4mc.amalthea.model.impl;
 
+import java.lang.reflect.InvocationTargetException;
+import java.util.Map;
 import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
+import org.eclipse.app4mc.amalthea.model.AmaltheaValidations;
 import org.eclipse.app4mc.amalthea.model.LocalModeLabel;
 import org.eclipse.app4mc.amalthea.model.ModeLabel;
 import org.eclipse.app4mc.amalthea.model.ModeLabelAssignment;
 
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -166,6 +171,16 @@
 	 * @generated
 	 */
 	@Override
+	public boolean validateInvariants(final DiagnosticChain diagnostics, final Map<Object, Object> context) {
+		return AmaltheaValidations.validateInvariants(this, diagnostics);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case AmaltheaPackage.MODE_LABEL_ASSIGNMENT__GLOBAL_LABEL:
@@ -230,4 +245,19 @@
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	@SuppressWarnings("unchecked")
+	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+		switch (operationID) {
+			case AmaltheaPackage.MODE_LABEL_ASSIGNMENT___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP:
+				return validateInvariants((DiagnosticChain)arguments.get(0), (Map<Object, Object>)arguments.get(1));
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
 } //ModeLabelAssignmentImpl
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelConditionImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelConditionImpl.java
index 35efdbe..cbfff8f 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelConditionImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelConditionImpl.java
@@ -17,7 +17,9 @@
 import com.google.common.base.Objects;
 import java.lang.reflect.InvocationTargetException;
 
+import java.util.Map;
 import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
+import org.eclipse.app4mc.amalthea.model.AmaltheaValidations;
 import org.eclipse.app4mc.amalthea.model.Condition;
 import org.eclipse.app4mc.amalthea.model.ConditionDisjunctionEntry;
 import org.eclipse.app4mc.amalthea.model.ISatisfiable;
@@ -28,6 +30,7 @@
 import org.eclipse.app4mc.amalthea.model.RelationalOperator;
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.EMap;
 
@@ -240,6 +243,16 @@
 	 * @generated
 	 */
 	@Override
+	public boolean validateInvariants(final DiagnosticChain diagnostics, final Map<Object, Object> context) {
+		return AmaltheaValidations.validateInvariants(this, diagnostics);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case AmaltheaPackage.MODE_LABEL_CONDITION__RELATION:
@@ -433,6 +446,8 @@
 		switch (operationID) {
 			case AmaltheaPackage.MODE_LABEL_CONDITION___IS_SATISFIED_BY__EMAP:
 				return isSatisfiedBy((EMap<ModeLabel, String>)arguments.get(0));
+			case AmaltheaPackage.MODE_LABEL_CONDITION___VALIDATE_INVARIANTS__DIAGNOSTICCHAIN_MAP:
+				return validateInvariants((DiagnosticChain)arguments.get(0), (Map<Object, Object>)arguments.get(1));
 		}
 		return super.eInvoke(operationID, arguments);
 	}
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelRefImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelRefImpl.java
index 1fd53be..77fe0a0 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelRefImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLabelRefImpl.java
@@ -14,7 +14,9 @@
  */
 package org.eclipse.app4mc.amalthea.model.impl;
 
+import java.lang.reflect.InvocationTargetException;
 import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
+import org.eclipse.app4mc.amalthea.model.Mode;
 import org.eclipse.app4mc.amalthea.model.ModeLabel;
 import org.eclipse.app4mc.amalthea.model.ModeLabelRef;
 
@@ -22,6 +24,7 @@
 
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -116,6 +119,41 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isEnum() {
+		return this.getValue().isEnum();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isNumeric() {
+		return this.getValue().isNumeric();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Mode getMode() {
+		ModeLabel _value = this.getValue();
+		Mode _mode = null;
+		if (_value!=null) {
+			_mode=_value.getMode();
+		}
+		return _mode;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case AmaltheaPackage.MODE_LABEL_REF__VALUE:
@@ -169,4 +207,22 @@
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+		switch (operationID) {
+			case AmaltheaPackage.MODE_LABEL_REF___IS_ENUM:
+				return isEnum();
+			case AmaltheaPackage.MODE_LABEL_REF___IS_NUMERIC:
+				return isNumeric();
+			case AmaltheaPackage.MODE_LABEL_REF___GET_MODE:
+				return getMode();
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
 } //ModeLabelRefImpl
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLiteralConstImpl.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLiteralConstImpl.java
index b44882d..7025869 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLiteralConstImpl.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/impl/ModeLiteralConstImpl.java
@@ -14,7 +14,10 @@
  */
 package org.eclipse.app4mc.amalthea.model.impl;
 
+import java.lang.reflect.InvocationTargetException;
 import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
+import org.eclipse.app4mc.amalthea.model.EnumMode;
+import org.eclipse.app4mc.amalthea.model.Mode;
 import org.eclipse.app4mc.amalthea.model.ModeLiteral;
 import org.eclipse.app4mc.amalthea.model.ModeLiteralConst;
 
@@ -22,6 +25,7 @@
 
 import org.eclipse.emf.common.notify.Notification;
 
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
 
@@ -116,6 +120,41 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isEnum() {
+		return true;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isNumeric() {
+		return false;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Mode getMode() {
+		ModeLiteral _value = this.getValue();
+		EnumMode _containingMode = null;
+		if (_value!=null) {
+			_containingMode=_value.getContainingMode();
+		}
+		return _containingMode;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case AmaltheaPackage.MODE_LITERAL_CONST__VALUE:
@@ -169,4 +208,22 @@
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+		switch (operationID) {
+			case AmaltheaPackage.MODE_LITERAL_CONST___IS_ENUM:
+				return isEnum();
+			case AmaltheaPackage.MODE_LITERAL_CONST___GET_MODE:
+				return getMode();
+			case AmaltheaPackage.MODE_LITERAL_CONST___IS_NUMERIC:
+				return isNumeric();
+		}
+		return super.eInvoke(operationID, arguments);
+	}
+
 } //ModeLiteralConstImpl
diff --git a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/util/AmaltheaValidator.java b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/util/AmaltheaValidator.java
index 8dbce76..7fc9f5d 100644
--- a/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/util/AmaltheaValidator.java
+++ b/plugins/org.eclipse.app4mc.amalthea.model/xcore-gen/org/eclipse/app4mc/amalthea/model/util/AmaltheaValidator.java
@@ -15,6 +15,433 @@
 package org.eclipse.app4mc.amalthea.model.util;
 
 import java.util.Map;
+import org.eclipse.app4mc.amalthea.model.ASILType;
+import org.eclipse.app4mc.amalthea.model.AbstractElementMappingConstraint;
+import org.eclipse.app4mc.amalthea.model.AbstractEventChain;
+import org.eclipse.app4mc.amalthea.model.AbstractMemoryElement;
+import org.eclipse.app4mc.amalthea.model.AbstractProcess;
+import org.eclipse.app4mc.amalthea.model.AccessMultiplicity;
+import org.eclipse.app4mc.amalthea.model.AccessPrecedenceSpec;
+import org.eclipse.app4mc.amalthea.model.AccessPrecedenceType;
+import org.eclipse.app4mc.amalthea.model.Activation;
+import org.eclipse.app4mc.amalthea.model.ActivityGraph;
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.AffinityConstraint;
+import org.eclipse.app4mc.amalthea.model.Alias;
+import org.eclipse.app4mc.amalthea.model.Amalthea;
+import org.eclipse.app4mc.amalthea.model.AmaltheaPackage;
+import org.eclipse.app4mc.amalthea.model.ArchitectureRequirement;
+import org.eclipse.app4mc.amalthea.model.ArithmeticExpression;
+import org.eclipse.app4mc.amalthea.model.ArithmeticOperator;
+import org.eclipse.app4mc.amalthea.model.Array;
+import org.eclipse.app4mc.amalthea.model.ArrivalCurveEntry;
+import org.eclipse.app4mc.amalthea.model.ArrivalCurveStimulus;
+import org.eclipse.app4mc.amalthea.model.AsynchronousServerCall;
+import org.eclipse.app4mc.amalthea.model.BaseObject;
+import org.eclipse.app4mc.amalthea.model.BaseTypeDefinition;
+import org.eclipse.app4mc.amalthea.model.BigIntegerObject;
+import org.eclipse.app4mc.amalthea.model.BlockingType;
+import org.eclipse.app4mc.amalthea.model.BooleanObject;
+import org.eclipse.app4mc.amalthea.model.BoundedContinuousValueDistribution;
+import org.eclipse.app4mc.amalthea.model.BoundedDiscreteValueDistribution;
+import org.eclipse.app4mc.amalthea.model.BoundedTimeDistribution;
+import org.eclipse.app4mc.amalthea.model.CPUPercentageMetric;
+import org.eclipse.app4mc.amalthea.model.CPUPercentageRequirementLimit;
+import org.eclipse.app4mc.amalthea.model.Cache;
+import org.eclipse.app4mc.amalthea.model.CacheDefinition;
+import org.eclipse.app4mc.amalthea.model.CacheType;
+import org.eclipse.app4mc.amalthea.model.CallArgument;
+import org.eclipse.app4mc.amalthea.model.ChainedProcessPrototype;
+import org.eclipse.app4mc.amalthea.model.Channel;
+import org.eclipse.app4mc.amalthea.model.ChannelAccess;
+import org.eclipse.app4mc.amalthea.model.ChannelEvent;
+import org.eclipse.app4mc.amalthea.model.ChannelEventType;
+import org.eclipse.app4mc.amalthea.model.ChannelFillCondition;
+import org.eclipse.app4mc.amalthea.model.ChannelFillRef;
+import org.eclipse.app4mc.amalthea.model.ChannelReceive;
+import org.eclipse.app4mc.amalthea.model.ChannelSend;
+import org.eclipse.app4mc.amalthea.model.Classification;
+import org.eclipse.app4mc.amalthea.model.Classifier;
+import org.eclipse.app4mc.amalthea.model.ClearEvent;
+import org.eclipse.app4mc.amalthea.model.Clock;
+import org.eclipse.app4mc.amalthea.model.ClockFunction;
+import org.eclipse.app4mc.amalthea.model.ClockStep;
+import org.eclipse.app4mc.amalthea.model.ClockStepList;
+import org.eclipse.app4mc.amalthea.model.CoherencyDirection;
+import org.eclipse.app4mc.amalthea.model.CombinatorialCondition;
+import org.eclipse.app4mc.amalthea.model.CommonElements;
+import org.eclipse.app4mc.amalthea.model.Component;
+import org.eclipse.app4mc.amalthea.model.ComponentEvent;
+import org.eclipse.app4mc.amalthea.model.ComponentEventType;
+import org.eclipse.app4mc.amalthea.model.ComponentInstance;
+import org.eclipse.app4mc.amalthea.model.ComponentInterface;
+import org.eclipse.app4mc.amalthea.model.ComponentPort;
+import org.eclipse.app4mc.amalthea.model.ComponentScope;
+import org.eclipse.app4mc.amalthea.model.ComponentStructure;
+import org.eclipse.app4mc.amalthea.model.ComponentsModel;
+import org.eclipse.app4mc.amalthea.model.Composite;
+import org.eclipse.app4mc.amalthea.model.CompoundType;
+import org.eclipse.app4mc.amalthea.model.ComputationItem;
+import org.eclipse.app4mc.amalthea.model.ConcurrencyType;
+import org.eclipse.app4mc.amalthea.model.Condition;
+import org.eclipse.app4mc.amalthea.model.ConditionConjunction;
+import org.eclipse.app4mc.amalthea.model.ConditionDisjunction;
+import org.eclipse.app4mc.amalthea.model.ConditionDisjunctionEntry;
+import org.eclipse.app4mc.amalthea.model.ConfigModel;
+import org.eclipse.app4mc.amalthea.model.ConnectionHandler;
+import org.eclipse.app4mc.amalthea.model.ConnectionHandlerDefinition;
+import org.eclipse.app4mc.amalthea.model.Connector;
+import org.eclipse.app4mc.amalthea.model.ConstraintsModel;
+import org.eclipse.app4mc.amalthea.model.ContinuousValueBetaDistribution;
+import org.eclipse.app4mc.amalthea.model.ContinuousValueBoundaries;
+import org.eclipse.app4mc.amalthea.model.ContinuousValueConstant;
+import org.eclipse.app4mc.amalthea.model.ContinuousValueGaussDistribution;
+import org.eclipse.app4mc.amalthea.model.ContinuousValueHistogram;
+import org.eclipse.app4mc.amalthea.model.ContinuousValueHistogramEntry;
+import org.eclipse.app4mc.amalthea.model.ContinuousValueInterval;
+import org.eclipse.app4mc.amalthea.model.ContinuousValueStatistics;
+import org.eclipse.app4mc.amalthea.model.ContinuousValueUniformDistribution;
+import org.eclipse.app4mc.amalthea.model.ContinuousValueWeibullEstimatorsDistribution;
+import org.eclipse.app4mc.amalthea.model.CoreAllocationConstraint;
+import org.eclipse.app4mc.amalthea.model.CoreClassification;
+import org.eclipse.app4mc.amalthea.model.CoreClassifier;
+import org.eclipse.app4mc.amalthea.model.CountMetric;
+import org.eclipse.app4mc.amalthea.model.CountRequirementLimit;
+import org.eclipse.app4mc.amalthea.model.Counter;
+import org.eclipse.app4mc.amalthea.model.CurveType;
+import org.eclipse.app4mc.amalthea.model.CustomActivation;
+import org.eclipse.app4mc.amalthea.model.CustomEntity;
+import org.eclipse.app4mc.amalthea.model.CustomEvent;
+import org.eclipse.app4mc.amalthea.model.CustomEventTrigger;
+import org.eclipse.app4mc.amalthea.model.CustomStimulus;
+import org.eclipse.app4mc.amalthea.model.DataAge;
+import org.eclipse.app4mc.amalthea.model.DataAgeConstraint;
+import org.eclipse.app4mc.amalthea.model.DataAgeCycle;
+import org.eclipse.app4mc.amalthea.model.DataAgeTime;
+import org.eclipse.app4mc.amalthea.model.DataCoherencyGroup;
+import org.eclipse.app4mc.amalthea.model.DataConstraint;
+import org.eclipse.app4mc.amalthea.model.DataConstraintTarget;
+import org.eclipse.app4mc.amalthea.model.DataDependency;
+import org.eclipse.app4mc.amalthea.model.DataGroupScope;
+import org.eclipse.app4mc.amalthea.model.DataPairingConstraint;
+import org.eclipse.app4mc.amalthea.model.DataRate;
+import org.eclipse.app4mc.amalthea.model.DataRateUnit;
+import org.eclipse.app4mc.amalthea.model.DataSeparationConstraint;
+import org.eclipse.app4mc.amalthea.model.DataSize;
+import org.eclipse.app4mc.amalthea.model.DataSizeUnit;
+import org.eclipse.app4mc.amalthea.model.DataStability;
+import org.eclipse.app4mc.amalthea.model.DataStabilityGroup;
+import org.eclipse.app4mc.amalthea.model.DataStabilityLevel;
+import org.eclipse.app4mc.amalthea.model.DataType;
+import org.eclipse.app4mc.amalthea.model.DataTypeDefinition;
+import org.eclipse.app4mc.amalthea.model.DelayConstraint;
+import org.eclipse.app4mc.amalthea.model.DirectionType;
+import org.eclipse.app4mc.amalthea.model.DiscreteValueBetaDistribution;
+import org.eclipse.app4mc.amalthea.model.DiscreteValueBoundaries;
+import org.eclipse.app4mc.amalthea.model.DiscreteValueConstant;
+import org.eclipse.app4mc.amalthea.model.DiscreteValueGaussDistribution;
+import org.eclipse.app4mc.amalthea.model.DiscreteValueHistogram;
+import org.eclipse.app4mc.amalthea.model.DiscreteValueHistogramEntry;
+import org.eclipse.app4mc.amalthea.model.DiscreteValueInterval;
+import org.eclipse.app4mc.amalthea.model.DiscreteValueStatistics;
+import org.eclipse.app4mc.amalthea.model.DiscreteValueUniformDistribution;
+import org.eclipse.app4mc.amalthea.model.DiscreteValueWeibullEstimatorsDistribution;
+import org.eclipse.app4mc.amalthea.model.DoubleObject;
+import org.eclipse.app4mc.amalthea.model.EnforcedMigration;
+import org.eclipse.app4mc.amalthea.model.EntityEvent;
+import org.eclipse.app4mc.amalthea.model.EnumMode;
+import org.eclipse.app4mc.amalthea.model.Event;
+import org.eclipse.app4mc.amalthea.model.EventActivation;
+import org.eclipse.app4mc.amalthea.model.EventChain;
+import org.eclipse.app4mc.amalthea.model.EventChainContainer;
+import org.eclipse.app4mc.amalthea.model.EventChainItem;
+import org.eclipse.app4mc.amalthea.model.EventChainItemType;
+import org.eclipse.app4mc.amalthea.model.EventChainLatencyConstraint;
+import org.eclipse.app4mc.amalthea.model.EventChainReference;
+import org.eclipse.app4mc.amalthea.model.EventChainSynchronizationConstraint;
+import org.eclipse.app4mc.amalthea.model.EventConfig;
+import org.eclipse.app4mc.amalthea.model.EventMask;
+import org.eclipse.app4mc.amalthea.model.EventModel;
+import org.eclipse.app4mc.amalthea.model.EventSet;
+import org.eclipse.app4mc.amalthea.model.EventStimulus;
+import org.eclipse.app4mc.amalthea.model.EventSynchronizationConstraint;
+import org.eclipse.app4mc.amalthea.model.ExecutionNeed;
+import org.eclipse.app4mc.amalthea.model.FixedPeriodic;
+import org.eclipse.app4mc.amalthea.model.FloatObject;
+import org.eclipse.app4mc.amalthea.model.Frequency;
+import org.eclipse.app4mc.amalthea.model.FrequencyDomain;
+import org.eclipse.app4mc.amalthea.model.FrequencyMetric;
+import org.eclipse.app4mc.amalthea.model.FrequencyRequirementLimit;
+import org.eclipse.app4mc.amalthea.model.FrequencyUnit;
+import org.eclipse.app4mc.amalthea.model.GeneralPrecedence;
+import org.eclipse.app4mc.amalthea.model.GetResultServerCall;
+import org.eclipse.app4mc.amalthea.model.Group;
+import org.eclipse.app4mc.amalthea.model.GroupingType;
+import org.eclipse.app4mc.amalthea.model.HWModel;
+import org.eclipse.app4mc.amalthea.model.HwAccessElement;
+import org.eclipse.app4mc.amalthea.model.HwAccessPath;
+import org.eclipse.app4mc.amalthea.model.HwConnection;
+import org.eclipse.app4mc.amalthea.model.HwDefinition;
+import org.eclipse.app4mc.amalthea.model.HwDestination;
+import org.eclipse.app4mc.amalthea.model.HwDomain;
+import org.eclipse.app4mc.amalthea.model.HwFeature;
+import org.eclipse.app4mc.amalthea.model.HwFeatureCategory;
+import org.eclipse.app4mc.amalthea.model.HwFeatureType;
+import org.eclipse.app4mc.amalthea.model.HwModule;
+import org.eclipse.app4mc.amalthea.model.HwPath;
+import org.eclipse.app4mc.amalthea.model.HwPathElement;
+import org.eclipse.app4mc.amalthea.model.HwPort;
+import org.eclipse.app4mc.amalthea.model.HwStructure;
+import org.eclipse.app4mc.amalthea.model.IActivityGraphItemContainer;
+import org.eclipse.app4mc.amalthea.model.IAnnotatable;
+import org.eclipse.app4mc.amalthea.model.IComponentContainer;
+import org.eclipse.app4mc.amalthea.model.IComponentStructureMember;
+import org.eclipse.app4mc.amalthea.model.IContinuousValueDeviation;
+import org.eclipse.app4mc.amalthea.model.IDependsOn;
+import org.eclipse.app4mc.amalthea.model.IDescription;
+import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation;
+import org.eclipse.app4mc.amalthea.model.IDisplayName;
+import org.eclipse.app4mc.amalthea.model.IExecutable;
+import org.eclipse.app4mc.amalthea.model.IInterfaceContainer;
+import org.eclipse.app4mc.amalthea.model.ILocalModeValueSource;
+import org.eclipse.app4mc.amalthea.model.INamed;
+import org.eclipse.app4mc.amalthea.model.INamespaceMember;
+import org.eclipse.app4mc.amalthea.model.IReferable;
+import org.eclipse.app4mc.amalthea.model.ISR;
+import org.eclipse.app4mc.amalthea.model.ISRAllocation;
+import org.eclipse.app4mc.amalthea.model.ISRCategory;
+import org.eclipse.app4mc.amalthea.model.ISatisfiable;
+import org.eclipse.app4mc.amalthea.model.ISchedulingParameterContainer;
+import org.eclipse.app4mc.amalthea.model.ISystem;
+import org.eclipse.app4mc.amalthea.model.ITaggable;
+import org.eclipse.app4mc.amalthea.model.ITimeDeviation;
+import org.eclipse.app4mc.amalthea.model.IntegerConst;
+import org.eclipse.app4mc.amalthea.model.IntegerObject;
+import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
+import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
+import org.eclipse.app4mc.amalthea.model.InterfaceKind;
+import org.eclipse.app4mc.amalthea.model.InterruptController;
+import org.eclipse.app4mc.amalthea.model.Label;
+import org.eclipse.app4mc.amalthea.model.LabelAccess;
+import org.eclipse.app4mc.amalthea.model.LabelAccessDataStability;
+import org.eclipse.app4mc.amalthea.model.LabelAccessEnum;
+import org.eclipse.app4mc.amalthea.model.LabelAccessImplementation;
+import org.eclipse.app4mc.amalthea.model.LabelAccessStatistic;
+import org.eclipse.app4mc.amalthea.model.LabelDataStability;
+import org.eclipse.app4mc.amalthea.model.LabelEntityGroup;
+import org.eclipse.app4mc.amalthea.model.LabelEvent;
+import org.eclipse.app4mc.amalthea.model.LabelEventType;
+import org.eclipse.app4mc.amalthea.model.LabelGroup;
+import org.eclipse.app4mc.amalthea.model.LatencyType;
+import org.eclipse.app4mc.amalthea.model.LimitType;
+import org.eclipse.app4mc.amalthea.model.ListObject;
+import org.eclipse.app4mc.amalthea.model.LocalModeCondition;
+import org.eclipse.app4mc.amalthea.model.LocalModeLabel;
+import org.eclipse.app4mc.amalthea.model.LocalModeLabelAssignment;
+import org.eclipse.app4mc.amalthea.model.LocalModeLabelRef;
+import org.eclipse.app4mc.amalthea.model.LocalModeValue;
+import org.eclipse.app4mc.amalthea.model.LongObject;
+import org.eclipse.app4mc.amalthea.model.MainInterface;
+import org.eclipse.app4mc.amalthea.model.MapObject;
+import org.eclipse.app4mc.amalthea.model.MappingModel;
+import org.eclipse.app4mc.amalthea.model.MappingType;
+import org.eclipse.app4mc.amalthea.model.Memory;
+import org.eclipse.app4mc.amalthea.model.MemoryAddressMappingType;
+import org.eclipse.app4mc.amalthea.model.MemoryClassification;
+import org.eclipse.app4mc.amalthea.model.MemoryClassifier;
+import org.eclipse.app4mc.amalthea.model.MemoryDefinition;
+import org.eclipse.app4mc.amalthea.model.MemoryMapping;
+import org.eclipse.app4mc.amalthea.model.MemoryMappingConstraint;
+import org.eclipse.app4mc.amalthea.model.MemoryType;
+import org.eclipse.app4mc.amalthea.model.MinAvgMaxStatistic;
+import org.eclipse.app4mc.amalthea.model.Mode;
+import org.eclipse.app4mc.amalthea.model.ModeAssignment;
+import org.eclipse.app4mc.amalthea.model.ModeCondition;
+import org.eclipse.app4mc.amalthea.model.ModeConditionConjunction;
+import org.eclipse.app4mc.amalthea.model.ModeConditionDisjunction;
+import org.eclipse.app4mc.amalthea.model.ModeConditionDisjunctionEntry;
+import org.eclipse.app4mc.amalthea.model.ModeLabel;
+import org.eclipse.app4mc.amalthea.model.ModeLabelAccess;
+import org.eclipse.app4mc.amalthea.model.ModeLabelAccessEnum;
+import org.eclipse.app4mc.amalthea.model.ModeLabelAssignment;
+import org.eclipse.app4mc.amalthea.model.ModeLabelCondition;
+import org.eclipse.app4mc.amalthea.model.ModeLabelEvent;
+import org.eclipse.app4mc.amalthea.model.ModeLabelEventType;
+import org.eclipse.app4mc.amalthea.model.ModeLabelRef;
+import org.eclipse.app4mc.amalthea.model.ModeLiteral;
+import org.eclipse.app4mc.amalthea.model.ModeLiteralConst;
+import org.eclipse.app4mc.amalthea.model.ModeSwitch;
+import org.eclipse.app4mc.amalthea.model.ModeSwitchDefault;
+import org.eclipse.app4mc.amalthea.model.ModeSwitchEntry;
+import org.eclipse.app4mc.amalthea.model.ModeValue;
+import org.eclipse.app4mc.amalthea.model.ModeValueCondition;
+import org.eclipse.app4mc.amalthea.model.ModeValueList;
+import org.eclipse.app4mc.amalthea.model.Namespace;
+import org.eclipse.app4mc.amalthea.model.NonAtomicDataCoherency;
+import org.eclipse.app4mc.amalthea.model.NumericMode;
+import org.eclipse.app4mc.amalthea.model.NumericStatistic;
+import org.eclipse.app4mc.amalthea.model.OSModel;
+import org.eclipse.app4mc.amalthea.model.OperatingSystem;
+import org.eclipse.app4mc.amalthea.model.OrderPrecedenceSpec;
+import org.eclipse.app4mc.amalthea.model.OrderType;
+import org.eclipse.app4mc.amalthea.model.OsAPIOverhead;
+import org.eclipse.app4mc.amalthea.model.OsDataConsistency;
+import org.eclipse.app4mc.amalthea.model.OsDataConsistencyMode;
+import org.eclipse.app4mc.amalthea.model.OsDefinition;
+import org.eclipse.app4mc.amalthea.model.OsEvent;
+import org.eclipse.app4mc.amalthea.model.OsISROverhead;
+import org.eclipse.app4mc.amalthea.model.OsOverhead;
+import org.eclipse.app4mc.amalthea.model.PairingConstraint;
+import org.eclipse.app4mc.amalthea.model.ParameterType;
+import org.eclipse.app4mc.amalthea.model.PercentageMetric;
+import org.eclipse.app4mc.amalthea.model.PercentageRequirementLimit;
+import org.eclipse.app4mc.amalthea.model.PeriodicActivation;
+import org.eclipse.app4mc.amalthea.model.PeriodicBurstStimulus;
+import org.eclipse.app4mc.amalthea.model.PeriodicStimulus;
+import org.eclipse.app4mc.amalthea.model.PeriodicSyntheticStimulus;
+import org.eclipse.app4mc.amalthea.model.PhysicalSectionConstraint;
+import org.eclipse.app4mc.amalthea.model.PhysicalSectionMapping;
+import org.eclipse.app4mc.amalthea.model.Pointer;
+import org.eclipse.app4mc.amalthea.model.PortInterface;
+import org.eclipse.app4mc.amalthea.model.PortType;
+import org.eclipse.app4mc.amalthea.model.PowerDomain;
+import org.eclipse.app4mc.amalthea.model.Preemption;
+import org.eclipse.app4mc.amalthea.model.ProbabilitySwitch;
+import org.eclipse.app4mc.amalthea.model.ProbabilitySwitchEntry;
+import org.eclipse.app4mc.amalthea.model.ProcessAllocationConstraint;
+import org.eclipse.app4mc.amalthea.model.ProcessChain;
+import org.eclipse.app4mc.amalthea.model.ProcessChainEvent;
+import org.eclipse.app4mc.amalthea.model.ProcessChainRequirement;
+import org.eclipse.app4mc.amalthea.model.ProcessConstraint;
+import org.eclipse.app4mc.amalthea.model.ProcessConstraintTarget;
+import org.eclipse.app4mc.amalthea.model.ProcessEntityGroup;
+import org.eclipse.app4mc.amalthea.model.ProcessEvent;
+import org.eclipse.app4mc.amalthea.model.ProcessEventType;
+import org.eclipse.app4mc.amalthea.model.ProcessGroup;
+import org.eclipse.app4mc.amalthea.model.ProcessPairingConstraint;
+import org.eclipse.app4mc.amalthea.model.ProcessPrototype;
+import org.eclipse.app4mc.amalthea.model.ProcessPrototypeAllocationConstraint;
+import org.eclipse.app4mc.amalthea.model.ProcessRequirement;
+import org.eclipse.app4mc.amalthea.model.ProcessScope;
+import org.eclipse.app4mc.amalthea.model.ProcessSeparationConstraint;
+import org.eclipse.app4mc.amalthea.model.ProcessingUnit;
+import org.eclipse.app4mc.amalthea.model.ProcessingUnitDefinition;
+import org.eclipse.app4mc.amalthea.model.PropertyConstraintsModel;
+import org.eclipse.app4mc.amalthea.model.PuType;
+import org.eclipse.app4mc.amalthea.model.QualifiedPort;
+import org.eclipse.app4mc.amalthea.model.Quantity;
+import org.eclipse.app4mc.amalthea.model.ReceiveOperation;
+import org.eclipse.app4mc.amalthea.model.ReferableBaseObject;
+import org.eclipse.app4mc.amalthea.model.ReferableObject;
+import org.eclipse.app4mc.amalthea.model.ReferenceObject;
+import org.eclipse.app4mc.amalthea.model.RelationalOperator;
+import org.eclipse.app4mc.amalthea.model.RelativePeriodicStimulus;
+import org.eclipse.app4mc.amalthea.model.RepetitionConstraint;
+import org.eclipse.app4mc.amalthea.model.Requirement;
+import org.eclipse.app4mc.amalthea.model.RequirementLimit;
+import org.eclipse.app4mc.amalthea.model.RunEntityCallStatistic;
+import org.eclipse.app4mc.amalthea.model.RunnableAllocation;
+import org.eclipse.app4mc.amalthea.model.RunnableAllocationConstraint;
+import org.eclipse.app4mc.amalthea.model.RunnableCall;
+import org.eclipse.app4mc.amalthea.model.RunnableConstraint;
+import org.eclipse.app4mc.amalthea.model.RunnableConstraintTarget;
+import org.eclipse.app4mc.amalthea.model.RunnableEntityGroup;
+import org.eclipse.app4mc.amalthea.model.RunnableEvent;
+import org.eclipse.app4mc.amalthea.model.RunnableEventType;
+import org.eclipse.app4mc.amalthea.model.RunnableGroup;
+import org.eclipse.app4mc.amalthea.model.RunnableOrderType;
+import org.eclipse.app4mc.amalthea.model.RunnablePairingConstraint;
+import org.eclipse.app4mc.amalthea.model.RunnableParameter;
+import org.eclipse.app4mc.amalthea.model.RunnableRequirement;
+import org.eclipse.app4mc.amalthea.model.RunnableScope;
+import org.eclipse.app4mc.amalthea.model.RunnableSeparationConstraint;
+import org.eclipse.app4mc.amalthea.model.RunnableSequencingConstraint;
+import org.eclipse.app4mc.amalthea.model.SWModel;
+import org.eclipse.app4mc.amalthea.model.SamplingType;
+import org.eclipse.app4mc.amalthea.model.Scenario;
+import org.eclipse.app4mc.amalthea.model.SchedPolicy;
+import org.eclipse.app4mc.amalthea.model.SchedulePoint;
+import org.eclipse.app4mc.amalthea.model.Scheduler;
+import org.eclipse.app4mc.amalthea.model.SchedulerAllocation;
+import org.eclipse.app4mc.amalthea.model.SchedulerAssociation;
+import org.eclipse.app4mc.amalthea.model.SchedulerDefinition;
+import org.eclipse.app4mc.amalthea.model.SchedulingParameterDefinition;
+import org.eclipse.app4mc.amalthea.model.Section;
+import org.eclipse.app4mc.amalthea.model.Semaphore;
+import org.eclipse.app4mc.amalthea.model.SemaphoreAccess;
+import org.eclipse.app4mc.amalthea.model.SemaphoreAccessEnum;
+import org.eclipse.app4mc.amalthea.model.SemaphoreEvent;
+import org.eclipse.app4mc.amalthea.model.SemaphoreEventType;
+import org.eclipse.app4mc.amalthea.model.SemaphoreType;
+import org.eclipse.app4mc.amalthea.model.SenderReceiverCommunication;
+import org.eclipse.app4mc.amalthea.model.SenderReceiverRead;
+import org.eclipse.app4mc.amalthea.model.SenderReceiverWrite;
+import org.eclipse.app4mc.amalthea.model.SeparationConstraint;
+import org.eclipse.app4mc.amalthea.model.ServerCall;
+import org.eclipse.app4mc.amalthea.model.SetEvent;
+import org.eclipse.app4mc.amalthea.model.Severity;
+import org.eclipse.app4mc.amalthea.model.SingleActivation;
+import org.eclipse.app4mc.amalthea.model.SingleStimulus;
+import org.eclipse.app4mc.amalthea.model.SingleValueStatistic;
+import org.eclipse.app4mc.amalthea.model.SporadicActivation;
+import org.eclipse.app4mc.amalthea.model.StimuliModel;
+import org.eclipse.app4mc.amalthea.model.Stimulus;
+import org.eclipse.app4mc.amalthea.model.StimulusEvent;
+import org.eclipse.app4mc.amalthea.model.StringObject;
+import org.eclipse.app4mc.amalthea.model.Struct;
+import org.eclipse.app4mc.amalthea.model.StructEntry;
+import org.eclipse.app4mc.amalthea.model.StructureType;
+import org.eclipse.app4mc.amalthea.model.SubEventChain;
+import org.eclipse.app4mc.amalthea.model.SubInterface;
+import org.eclipse.app4mc.amalthea.model.Switch;
+import org.eclipse.app4mc.amalthea.model.SwitchDefault;
+import org.eclipse.app4mc.amalthea.model.SwitchEntry;
+import org.eclipse.app4mc.amalthea.model.SynchronizationConstraint;
+import org.eclipse.app4mc.amalthea.model.SynchronizationType;
+import org.eclipse.app4mc.amalthea.model.SynchronousServerCall;
+import org.eclipse.app4mc.amalthea.model.Tag;
+import org.eclipse.app4mc.amalthea.model.TagGroup;
+import org.eclipse.app4mc.amalthea.model.TargetCore;
+import org.eclipse.app4mc.amalthea.model.TargetMemory;
+import org.eclipse.app4mc.amalthea.model.TargetScheduler;
+import org.eclipse.app4mc.amalthea.model.Task;
+import org.eclipse.app4mc.amalthea.model.TaskAllocation;
+import org.eclipse.app4mc.amalthea.model.TaskScheduler;
+import org.eclipse.app4mc.amalthea.model.TerminateProcess;
+import org.eclipse.app4mc.amalthea.model.Ticks;
+import org.eclipse.app4mc.amalthea.model.Time;
+import org.eclipse.app4mc.amalthea.model.TimeBetaDistribution;
+import org.eclipse.app4mc.amalthea.model.TimeBoundaries;
+import org.eclipse.app4mc.amalthea.model.TimeConstant;
+import org.eclipse.app4mc.amalthea.model.TimeGaussDistribution;
+import org.eclipse.app4mc.amalthea.model.TimeHistogram;
+import org.eclipse.app4mc.amalthea.model.TimeHistogramEntry;
+import org.eclipse.app4mc.amalthea.model.TimeInterval;
+import org.eclipse.app4mc.amalthea.model.TimeMetric;
+import org.eclipse.app4mc.amalthea.model.TimeRequirementLimit;
+import org.eclipse.app4mc.amalthea.model.TimeStatistics;
+import org.eclipse.app4mc.amalthea.model.TimeUniformDistribution;
+import org.eclipse.app4mc.amalthea.model.TimeUnit;
+import org.eclipse.app4mc.amalthea.model.TimeWeibullEstimatorsDistribution;
+import org.eclipse.app4mc.amalthea.model.TimingConstraint;
+import org.eclipse.app4mc.amalthea.model.TransmissionPolicy;
+import org.eclipse.app4mc.amalthea.model.TriggerEvent;
+import org.eclipse.app4mc.amalthea.model.TruncatedContinuousValueDistribution;
+import org.eclipse.app4mc.amalthea.model.TruncatedDiscreteValueDistribution;
+import org.eclipse.app4mc.amalthea.model.TruncatedTimeDistribution;
+import org.eclipse.app4mc.amalthea.model.TypeDefinition;
+import org.eclipse.app4mc.amalthea.model.TypeRef;
+import org.eclipse.app4mc.amalthea.model.Value;
+import org.eclipse.app4mc.amalthea.model.VariableRateActivation;
+import org.eclipse.app4mc.amalthea.model.VariableRateStimulus;
+import org.eclipse.app4mc.amalthea.model.VendorOperatingSystem;
+import org.eclipse.app4mc.amalthea.model.Voltage;
+import org.eclipse.app4mc.amalthea.model.VoltageUnit;
+import org.eclipse.app4mc.amalthea.model.WaitEvent;
+import org.eclipse.app4mc.amalthea.model.WaitEventType;
+import org.eclipse.app4mc.amalthea.model.WaitingBehaviour;
+import org.eclipse.app4mc.amalthea.model.WhileLoop;
+import org.eclipse.app4mc.amalthea.model.WriteStrategy;
 import org.eclipse.app4mc.amalthea.model.*;
 import org.eclipse.emf.common.util.DiagnosticChain;
 import org.eclipse.emf.common.util.ResourceLocator;
@@ -124,12 +551,20 @@
 	public static final int MODE_VALUE__VALIDATE_INVARIANTS = 9;
 
 	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Invariants' of 'Mode Label Condition'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int MODE_LABEL_CONDITION__VALIDATE_INVARIANTS = 10;
+
+	/**
 	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Invariants' of 'Mode Label'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final int MODE_LABEL__VALIDATE_INVARIANTS = 10;
+	public static final int MODE_LABEL__VALIDATE_INVARIANTS = 11;
 
 	/**
 	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Invariants' of 'Mode Label Access'.
@@ -137,7 +572,31 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final int MODE_LABEL_ACCESS__VALIDATE_INVARIANTS = 11;
+	public static final int MODE_LABEL_ACCESS__VALIDATE_INVARIANTS = 12;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Invariants' of 'Local Mode Label'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int LOCAL_MODE_LABEL__VALIDATE_INVARIANTS = 13;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Invariants' of 'Local Mode Value'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int LOCAL_MODE_VALUE__VALIDATE_INVARIANTS = 14;
+
+	/**
+	 * The {@link org.eclipse.emf.common.util.Diagnostic#getCode() code} for constraint 'Validate Invariants' of 'Mode Label Assignment'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final int MODE_LABEL_ASSIGNMENT__VALIDATE_INVARIANTS = 15;
 
 	/**
 	 * A constant with a fixed name that can be used as the base value for additional hand written constants.
@@ -145,7 +604,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private static final int GENERATED_DIAGNOSTIC_CODE_COUNT = 11;
+	private static final int GENERATED_DIAGNOSTIC_CODE_COUNT = 15;
 
 	/**
 	 * A constant with a fixed name that can be used as the base value for additional hand written constants in a derived class.
@@ -4645,7 +5104,27 @@
 	 * @generated
 	 */
 	public boolean validateModeLabelCondition(ModeLabelCondition modeLabelCondition, DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return validate_EveryDefaultConstraint(modeLabelCondition, diagnostics, context);
+		if (!validate_NoCircularContainment(modeLabelCondition, diagnostics, context)) return false;
+		boolean result = validate_EveryMultiplicityConforms(modeLabelCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(modeLabelCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(modeLabelCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(modeLabelCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryProxyResolves(modeLabelCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_UniqueID(modeLabelCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryKeyUnique(modeLabelCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(modeLabelCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validateModeLabelCondition_validateInvariants(modeLabelCondition, diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateInvariants constraint of '<em>Mode Label Condition</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateModeLabelCondition_validateInvariants(ModeLabelCondition modeLabelCondition, DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return modeLabelCondition.validateInvariants(diagnostics, context);
 	}
 
 	/**
@@ -6069,17 +6548,47 @@
 		if (result || diagnostics != null) result &= validate_UniqueID(localModeLabel, diagnostics, context);
 		if (result || diagnostics != null) result &= validate_EveryKeyUnique(localModeLabel, diagnostics, context);
 		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(localModeLabel, diagnostics, context);
-		if (result || diagnostics != null) result &= validateIReferable_validateInvariants(localModeLabel, diagnostics, context);
+		if (result || diagnostics != null) result &= validateLocalModeLabel_validateInvariants(localModeLabel, diagnostics, context);
 		return result;
 	}
 
 	/**
+	 * Validates the validateInvariants constraint of '<em>Local Mode Label</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateLocalModeLabel_validateInvariants(LocalModeLabel localModeLabel, DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return localModeLabel.validateInvariants(diagnostics, context);
+	}
+
+	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
 	public boolean validateLocalModeValue(LocalModeValue localModeValue, DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return validate_EveryDefaultConstraint(localModeValue, diagnostics, context);
+		if (!validate_NoCircularContainment(localModeValue, diagnostics, context)) return false;
+		boolean result = validate_EveryMultiplicityConforms(localModeValue, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(localModeValue, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(localModeValue, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(localModeValue, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryProxyResolves(localModeValue, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_UniqueID(localModeValue, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryKeyUnique(localModeValue, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(localModeValue, diagnostics, context);
+		if (result || diagnostics != null) result &= validateLocalModeValue_validateInvariants(localModeValue, diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateInvariants constraint of '<em>Local Mode Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateLocalModeValue_validateInvariants(LocalModeValue localModeValue, DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return localModeValue.validateInvariants(diagnostics, context);
 	}
 
 	/**
@@ -6088,7 +6597,17 @@
 	 * @generated
 	 */
 	public boolean validateLocalModeLabelAssignment(LocalModeLabelAssignment localModeLabelAssignment, DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return validate_EveryDefaultConstraint(localModeLabelAssignment, diagnostics, context);
+		if (!validate_NoCircularContainment(localModeLabelAssignment, diagnostics, context)) return false;
+		boolean result = validate_EveryMultiplicityConforms(localModeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(localModeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(localModeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(localModeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryProxyResolves(localModeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_UniqueID(localModeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryKeyUnique(localModeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(localModeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validateLocalModeValue_validateInvariants(localModeLabelAssignment, diagnostics, context);
+		return result;
 	}
 
 	/**
@@ -6097,7 +6616,17 @@
 	 * @generated
 	 */
 	public boolean validateLocalModeCondition(LocalModeCondition localModeCondition, DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return validate_EveryDefaultConstraint(localModeCondition, diagnostics, context);
+		if (!validate_NoCircularContainment(localModeCondition, diagnostics, context)) return false;
+		boolean result = validate_EveryMultiplicityConforms(localModeCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(localModeCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(localModeCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(localModeCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryProxyResolves(localModeCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_UniqueID(localModeCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryKeyUnique(localModeCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(localModeCondition, diagnostics, context);
+		if (result || diagnostics != null) result &= validateLocalModeValue_validateInvariants(localModeCondition, diagnostics, context);
+		return result;
 	}
 
 	/**
@@ -6169,7 +6698,27 @@
 	 * @generated
 	 */
 	public boolean validateModeLabelAssignment(ModeLabelAssignment modeLabelAssignment, DiagnosticChain diagnostics, Map<Object, Object> context) {
-		return validate_EveryDefaultConstraint(modeLabelAssignment, diagnostics, context);
+		if (!validate_NoCircularContainment(modeLabelAssignment, diagnostics, context)) return false;
+		boolean result = validate_EveryMultiplicityConforms(modeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryDataValueConforms(modeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryReferenceIsContained(modeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryBidirectionalReferenceIsPaired(modeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryProxyResolves(modeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_UniqueID(modeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryKeyUnique(modeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validate_EveryMapEntryUnique(modeLabelAssignment, diagnostics, context);
+		if (result || diagnostics != null) result &= validateModeLabelAssignment_validateInvariants(modeLabelAssignment, diagnostics, context);
+		return result;
+	}
+
+	/**
+	 * Validates the validateInvariants constraint of '<em>Mode Label Assignment</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean validateModeLabelAssignment_validateInvariants(ModeLabelAssignment modeLabelAssignment, DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return modeLabelAssignment.validateInvariants(diagnostics, context);
 	}
 
 	/**